Спасайте мои нервы =( ZwQueryDirectoryFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем WIN32, 23 мар 2007.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Бсодит =( причём если в cmd просто набирать dir то не бсодит, а если допустим открыть мой компьютер то сразу бсод.
    мучаюсь уже долго.
    Код (Text):
    1. 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)
    2. {
    3.     NTSTATUS                                rc;
    4.     UNICODE_STRING                          usFileName;
    5.  
    6.     rc = OldZwQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileName,RestartScan);
    7.     if (NT_SUCCESS(rc) ||
    8.          FileInformationClass == FileDirectoryInformation ||
    9.          FileInformationClass == FileFullDirectoryInformation ||
    10.          FileInformationClass == FileIdFullDirectoryInformation ||
    11.          FileInformationClass == FileBothDirectoryInformation ||
    12.          FileInformationClass == FileIdBothDirectoryInformation ||
    13.          FileInformationClass == FileNamesInformation )
    14.     {
    15.         PVOID                                   pFileInfo = FileInformation;
    16.         PVOID                                   pPrevFileInfo;
    17.         while (pFileInfo)
    18.         {
    19.             __try
    20.             {
    21.                 DbgPrint("[%ws]",getDirInfoFileName(pFileInfo,FileInformationClass));
    22.             }
    23.             __except(KMODE_EXCEPTION_NOT_HANDLED)
    24.             {
    25.                                 DbgPrint("except");
    26.             }
    27.             if (getDirInfoNextEntryOffset(pFileInfo,FileInformationClass))
    28.             {
    29.                 pPrevFileInfo = (PVOID)getDirInfoNextEntryOffset(pFileInfo,FileInformationClass);
    30.                 *(ULONG*)&pFileInfo += getDirInfoNextEntryOffset(pFileInfo,FileInformationClass);
    31.             }   else    {
    32.                 pFileInfo = NULL;
    33.             }
    34.         }
    35.     }
    36.     return rc;
    37. }
    38. wchar_t *getDirInfoFileName(IN PVOID FileInformationBuffer,IN FILE_INFORMATION_CLASS FileInfoClass)
    39. {
    40.     wchar_t *result;
    41.     switch(FileInfoClass){
    42.         case FileDirectoryInformation:
    43.             result =((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileName;
    44.             break;
    45.         case FileFullDirectoryInformation:
    46.             result =((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName;
    47.             break;
    48.         case FileIdFullDirectoryInformation:
    49.             result =((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName;
    50.             break;
    51.         case FileBothDirectoryInformation:
    52.             result =((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName;
    53.             break;
    54.         case FileIdBothDirectoryInformation:
    55.             result =((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName;
    56.             break;
    57.         case FileNamesInformation:
    58.             result =((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileName;
    59.             break;
    60.     }
    61.     return result;
    62. }
    63.  
    64. ULONG getDirInfoNextEntryOffset(IN PVOID FileInformationBuffer,IN FILE_INFORMATION_CLASS FileInfoClass)
    65. {
    66.     ULONG result = 0;
    67.     switch(FileInfoClass){
    68.         case FileDirectoryInformation:
    69.             result = ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    70.             break;
    71.         case FileFullDirectoryInformation:
    72.             result = ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    73.             break;
    74.         case FileIdFullDirectoryInformation:
    75.             result = ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    76.             break;
    77.         case FileBothDirectoryInformation:
    78.             result = ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    79.             break;
    80.         case FileIdBothDirectoryInformation:
    81.             result = ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    82.             break;
    83.         case FileNamesInformation:
    84.             result = ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset;
    85.             break;
    86.     }
    87.     return result;
    88. }
     
  2. PageFault

    PageFault New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    31
    Маленький пузырек йаду очень хорошо спасает нервы. Рекомендую принять :)
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Какой код ошибки в БСОД?
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Ты же должен возвратить результат операции, а ты, например, выставляя
    pFileInfo = NULL; не выставляешь rc -> вызывающий считает что в PFileInfo чтой-то отличное от NULL -> вот тебе первая проблема.

    Строчку где *,&,(ULONG*) мои непроснувшиеся мозги решительно отказываются понимать.
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    imho, if (NT_SUCCESS(rc) && (FileInformationClass == FileDirectoryInformation || FileInformationClass == ... || )) {

    PS Наверное, надо учить С, перед тем как на нем писать ;)
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    censored
    бревна то я и не заметил ;)))
     
  7. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    WIN32 http://www.rit.edu/~jrk9185/rootkit/6-7/rootkit.c
    вот сорец идентичный твоему, смотри ... ищи несоответствия :)
     
  8. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    эх...модеры закройте тему.