Загадочный глюк моего драйвера или меня?

Тема в разделе "WASM.WIN32", создана пользователем Progr, 24 ноя 2006.

  1. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Господа, такая фигня происходит:
    Перехватываю ntQueryDirectoryFile, все вроде работает, система не падает и все скрывается как положено, НО:
    - Когда я пытаюсь скрыть один определенный каталог (D:\Test) или файл с тем же именем и путем то происходит нечто неоъяснимое для меня: исчезает все!
    Проверяю в Windows Commander и как только драйвер получает этот путь, то активная панель в WC моментально пустеет .... при этом если драйвер не деактивировать, то начинается полный армагеддон (т.к. блокируется похоже что все подряд, в т.ч. логичие диски(типа Диск D: или C: не найден)) и как результат - БСОД.
    Более того, код прячущий файлы/каталоги УПРАВЛЕНИЕ НЕ ПОЛУЧАЕТ!
    С чем это может быть связано.
    Если нужно код - выложу, просто он не маленький.

    Спасибо.
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Вероятно, ошибка в перехвате, управление сразу же возвращается обратно. В WinDbg или айсе ставь бряк на перехватываемую функцию и по шагам смотри, куда она пойдет дальше
     
  3. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    - Тогда почему только с одним путем?
    - К сожалению у меня нет отладчика...

    На всякий случай, вот код перехвата + процедурка сравнения перехваченных имен файлов/каталогов со связанным списком "запрещенных путей":

    Код (Text):
    1. typedef struct _HIDDEN_FILE_ENTRY {
    2.     struct _HIDDEN_FILE_ENTRY *PrevEntry;
    3.     struct _HIDDEN_FILE_ENTRY *NextEntry;
    4.     ULONG Directory;
    5.     ULONG FileNameLength;
    6.     WCHAR FileName[1];
    7. } HIDDEN_FILE_ENTRY, *PHIDDEN_FILE_ENTRY;
    8.  
    9. BOOLEAN IsHidden (IN UNICODE_STRING uniFileName, IN ULONG uDir) {
    10.     ULONG uPos;
    11.     PHIDDEN_FILE_ENTRY pEntry;
    12.     UNICODE_STRING uniHideDirFile;
    13.     pEntry = pFirstEntry;
    14.     for (uPos = 0; uPos < uEntriesCount; uPos++) {
    15.         RtlInitUnicodeString(&uniHideDirFile, pEntry->FileName);
    16.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    17.                 return TRUE;
    18.             }
    19.         if (pEntry->NextEntry != 0) pEntry=pEntry->NextEntry; else break;
    20.     }
    21.     return FALSE;
    22. }
    23.  
    24. NTSTATUS NewNtQueryDirectoryFile(
    25.     IN HANDLE hFile,
    26.     IN HANDLE hEvent OPTIONAL,
    27.     IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
    28.     IN PVOID IoApcContext OPTIONAL,
    29.     OUT PIO_STATUS_BLOCK pIoStatusBlock,
    30.     OUT PVOID FileInformation,
    31.     IN ULONG FileInformationLength,
    32.     IN FILE_INFORMATION_CLASS FileInformationClass,
    33.     IN BOOLEAN bReturnOnlyOneEntry,
    34.     IN PUNICODE_STRING PathMask OPTIONAL,
    35.     IN BOOLEAN bRestartQuery
    36. )
    37. {
    38.   ULONG Offset, Atr;
    39.   NTSTATUS ns, RESULT;
    40.   PWCHAR Name;
    41.   UNICODE_STRING Last, Slash;
    42.   SIZE_T neededSize;
    43.   UNICODE_STRING uniFileName;
    44.   PFILE_DIRECTORY_INFORMATION LastFileDirectoryInfo, FileDirectoryInfo;
    45.   PFILE_FULL_DIRECTORY_INFORMATION LastFileFullDirectoryInfo, FileFullDirectoryInfo;
    46.   PFILE_BOTH_DIRECTORY_INFORMATION LastFileBothDirectoryInfo, FileBothDirectoryInfo;
    47.   PFILE_NAMES_INFORMATION LastFileNamesInfo, FileNamesInfo;
    48.   char ParentDirectory[1024];
    49.   PUNICODE_STRING Parent=NULL;
    50.   ULONG BytesReturned;
    51.   UNICODE_STRING uDOSPath, uPath, uTail;
    52.   PFILE_OBJECT file=0;
    53.   wchar_t *uPos;
    54.  
    55.   RESULT=TrueNtQueryDirectoryFile(hFile,hEvent,IoApcRoutine,IoApcContext,pIoStatusBlock,FileInformation,
    56.                             FileInformationLength,FileInformationClass,bReturnOnlyOneEntry,PathMask,bRestartQuery);
    57.   if (!NT_SUCCESS(RESULT))
    58.       return RESULT;
    59.  
    60.   ParentDirectory[0]='\0';
    61.   Parent=(PUNICODE_STRING)ParentDirectory;
    62.  
    63.   RtlInitUnicodeString (&uTail, L"\\DEVICE\\HARDDISKVOLUME");
    64.   ns=ObReferenceObjectByHandle(hFile,0,0,KernelMode,&file,NULL);
    65.   if (!NT_SUCCESS(ns)) {
    66.       DbgPrint ("Unable to finish first stage");
    67.       return RESULT;
    68.   } else {
    69.     ns = IoVolumeDeviceToDosName(file->DeviceObject, &uDOSPath);
    70.     if (!NT_SUCCESS(ns)) {
    71.       DbgPrint ("Unable to finish last stage");
    72.       return RESULT;
    73.     } else {
    74.         ns=ObQueryNameString(file, (POBJECT_NAME_INFORMATION)ParentDirectory, sizeof(ParentDirectory), &BytesReturned);
    75.         if (!NT_SUCCESS(ns)) {
    76.             DbgPrint ("Unable to finish second stage");
    77.             return RESULT;
    78.         } else {
    79.               RtlUpcaseUnicodeString(Parent, Parent, FALSE);
    80.               uPos = wcsstr(Parent->Buffer, uTail.Buffer);
    81.               if (uPos) {
    82.                 neededSize = (Parent->Length-23 + uDOSPath.Length + 2) * 2;
    83.                 Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    84.                 RtlZeroMemory(Name, neededSize);
    85.                 wcsncpy(Name, uDOSPath.Buffer, uDOSPath.Length);
    86.                 wcsncat(Name, Parent->Buffer+23, Parent->Length-23);
    87.                 RtlInitUnicodeString(&uPath,Name);
    88.               }
    89.               else
    90.               {
    91.                   return RESULT;
    92.               }
    93.         }
    94.         ExFreePool (uDOSPath.Buffer);
    95.     }
    96.     ObDereferenceObject(&file);
    97.   }
    98.   RtlInitUnicodeString (&Slash, L"\\");
    99.   Offset = 0;
    100.   switch (FileInformationClass) {
    101.     case FileDirectoryInformation:
    102.     //Blah blah blah
    103.     break;
    104.     case FileFullhDirectoryInformation:
    105.     //Blah blah blah
    106.     break
    107.     case FileBothDirectoryInformation:
    108.         LastFileBothDirectoryInfo = FileBothDirectoryInfo = NULL;
    109.         do {
    110.           FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    111.           neededSize = (uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) * sizeof(wchar_t);
    112.           Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    113.           RtlZeroMemory(Name, neededSize);
    114.           wcsncpy(Name, uPath.Buffer, uPath.Length / sizeof(wchar_t));
    115.           RtlInitUnicodeString(&Last, Name+((uPath.Length-1) / sizeof(wchar_t)));
    116.           if (RtlCompareUnicodeString(&Last, &Slash, TRUE ) != 0) {
    117.             wcsncat(Name, L"\\", 1);
    118.           }
    119.           wcsncat(Name, FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t));
    120.           Name[(uPath.Length + FileBothDirectoryInfo->FileNameLength + 2) / sizeof(wchar_t)] = 0;
    121.           RtlInitUnicodeString(&uniFileName, Name);
    122.           Atr=5;
    123.           if ((FileBothDirectoryInfo->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) Atr=10;
    124.           if (IsHidden(uniFileName, Atr)) {
    125.                 DbgPrint("Hiding: %ws", uniFileName.Buffer);
    126.                 if (!FileBothDirectoryInfo->NextEntryOffset) {
    127.                     if (LastFileBothDirectoryInfo) {
    128.                         LastFileBothDirectoryInfo->NextEntryOffset = 0;
    129.                     } else {
    130.                         return STATUS_NO_SUCH_FILE;
    131.                     }
    132.                  }
    133.                  else
    134.                  {
    135.                     if (LastFileBothDirectoryInfo) {
    136.                         LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    137.                     }
    138.                  }
    139.           } else {
    140.               LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    141.           }
    142.           ExFreePool(Name);
    143.           uniFileName.Buffer=0;
    144.           Offset += FileBothDirectoryInfo->NextEntryOffset;
    145.         } while (FileBothDirectoryInfo->NextEntryOffset);
    146.     break;
    147.     case FileNamesInformation:
    148.     //Blah blah blah
    149.     break;
    150.   }
    151.   return (RESULT);
    152. }
    Вот...