Бсодит =( причём если в cmd просто набирать dir то не бсодит, а если допустим открыть мой компьютер то сразу бсод. мучаюсь уже долго. Код (Text): NTSTATUS NewZwQueryDirectoryFile (IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,OUT PVOID FileInformation,IN ULONG Length,IN FILE_INFORMATION_CLASS FileInformationClass,IN BOOLEAN ReturnSingleEntry,IN PUNICODE_STRING FileName OPTIONAL,IN BOOLEAN RestartScan) { NTSTATUS rc; UNICODE_STRING usFileName; rc = OldZwQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileName,RestartScan); if (NT_SUCCESS(rc) || FileInformationClass == FileDirectoryInformation || FileInformationClass == FileFullDirectoryInformation || FileInformationClass == FileIdFullDirectoryInformation || FileInformationClass == FileBothDirectoryInformation || FileInformationClass == FileIdBothDirectoryInformation || FileInformationClass == FileNamesInformation ) { PVOID pFileInfo = FileInformation; PVOID pPrevFileInfo; while (pFileInfo) { __try { DbgPrint("[%ws]",getDirInfoFileName(pFileInfo,FileInformationClass)); } __except(KMODE_EXCEPTION_NOT_HANDLED) { DbgPrint("except"); } if (getDirInfoNextEntryOffset(pFileInfo,FileInformationClass)) { pPrevFileInfo = (PVOID)getDirInfoNextEntryOffset(pFileInfo,FileInformationClass); *(ULONG*)&pFileInfo += getDirInfoNextEntryOffset(pFileInfo,FileInformationClass); } else { pFileInfo = NULL; } } } return rc; } wchar_t *getDirInfoFileName(IN PVOID FileInformationBuffer,IN FILE_INFORMATION_CLASS FileInfoClass) { wchar_t *result; switch(FileInfoClass){ case FileDirectoryInformation: result =((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileName; break; case FileFullDirectoryInformation: result =((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName; break; case FileIdFullDirectoryInformation: result =((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName; break; case FileBothDirectoryInformation: result =((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName; break; case FileIdBothDirectoryInformation: result =((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName; break; case FileNamesInformation: result =((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileName; break; } return result; } ULONG getDirInfoNextEntryOffset(IN PVOID FileInformationBuffer,IN FILE_INFORMATION_CLASS FileInfoClass) { ULONG result = 0; switch(FileInfoClass){ case FileDirectoryInformation: result = ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; case FileFullDirectoryInformation: result = ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; case FileIdFullDirectoryInformation: result = ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; case FileBothDirectoryInformation: result = ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; case FileIdBothDirectoryInformation: result = ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; case FileNamesInformation: result = ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset; break; } return result; }
Ты же должен возвратить результат операции, а ты, например, выставляя pFileInfo = NULL; не выставляешь rc -> вызывающий считает что в PFileInfo чтой-то отличное от NULL -> вот тебе первая проблема. Строчку где *,&,(ULONG*) мои непроснувшиеся мозги решительно отказываются понимать.
imho, if (NT_SUCCESS(rc) && (FileInformationClass == FileDirectoryInformation || FileInformationClass == ... || )) { PS Наверное, надо учить С, перед тем как на нем писать
WIN32 http://www.rit.edu/~jrk9185/rootkit/6-7/rootkit.c вот сорец идентичный твоему, смотри ... ищи несоответствия