Привет! Перехватываю удаление файла через NtSetInformationFile (надеюсь правильно ). Насколько я понял, если флаг FileInformationClass==13, то файл удален. А как мне можно до вызова ОРИГИНАЛЬНОЙ функции получить сведение об удаляемом файле. В частности ег имя и (желательно), полный путь
О! Плохо.. Во первых у меня нет описания этих функций.. А во вторых -а разве не несет ни одно поле функции NtSetInformationFile (IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID FileInformation,IN ULONG FileInformationLength,IN FILE_INFORMATION_CLASS FileInformationClass) инфо о файле? А что за указатель FileInformation ?
Понятно.... Ок, пытаюсь получить так Код (Text): typedef struct _FILE_NAME_INFORMATION { ULONG FileNameLegth; WCHAR FileName[1]; } FILE_NAME_INFORMATION,*PFILE_NAME_INFORMATION; FILE_NAME_INFORMATION pki = {0}; PIO_STATUS_BLOCK psb = {0}; NTSTATUS status; pNtQueryFile=NULL; reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile"); status = pNtQueryFile(FileHandle,psb, &pki,sizeof(pki),9); Так вот функция возвращает ошибку.. А строки имени файла-пустые
Да, сорри. И все же вопрос остается открытым Попробывал сделать через NtQueryObject Код (Text): WCHAR keyName[512]=L""; ULONG rLen=0, sLen=0; OBJECT_NAME_INFORMATION pki = {0}; NTSTATUS status; PWCHAR pwszKeyName=NULL; pNtQueryFile=NULL; reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryObject"); if (pNtQueryFile==NULL) { wcscpy(ch,keyName); return; } status = pNtQueryFile(FileHandle,ObjectNameInformation, &pki,sizeof(pki),&sLen); if (status!=STATUS_SUCCESS) { DWORD err=GetLastError(); return; } Все равно-не работает..... Хотя err=0; Просто функция возвращает status!=STATUS_SUCCESS... Бред какой-то. Неужели никто не знает, как из юзер моде получить имя файла по хендлу?
Если поднятся на 4 поста выше, то можно увидеть код, где я уже вызывал эту функцию и комментарий к нему
конечно ошибку. я бы на ее месте тоже возвратил ошибку PIO_STATUS_BLOCK psb = {0}; NTSTATUS status; pNtQueryFile=NULL; reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile"); status = pNtQueryFile(FileHandle,psb, &pki,sizeof(pki),9); а кто выделит память под IO_STATUS_BLOCK? Правильно так: IO_STATUS_BLOCK IoStatus = {0}; NTSTATUS status; pNtQueryFile=NULL; reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile"); status = pNtQueryFile(FileHandle, &IoStatus, &pki,sizeof(pki),9);
Сорри. Опечатка в коде.. НО! Работает только такой расклад Код (Text): IO_STATUS_BLOCK iosb; PFILE_NAME_INFORMATION fii=(PFILE_NAME_INFORMATION) new BYTE[512]; NTSTATUS status; PWCHAR pwszKeyName=NULL; pNtQueryFile=NULL; reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile"); if (pNtQueryFile==NULL) { wcscpy(ch,keyName); return; } status = pNtQueryFile(FileHandle,&iosb, fii,512,FileNameInformation); if (status!=STATUS_SUCCESS) { DWORD err=GetLastError(); wcscpy(ch,keyName); return; } 512 взял от фонаря.. А как определить реальный размер?
И еще вопросик, раз уже заметил.. А ведь нет буквы диска впереди. Путь начинается со слеша... А где брать С: или Е: ??