Перехват идет ок. Использование любого из способов: ObReferenceObjectByHandle, ZwQueryInformationFile получения имени файла дает STATUS_INVALID_HANDLE. Код (Text): NTSTATUS NewNtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength ) { NTSTATUS ret = TrueNtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength); FILE_NAME_INFORMATION fni = {0}; PIO_STATUS_BLOCK psb = {0}; if (ret == STATUS_SUCCESS) { __try { PFILE_OBJECT pF; NTSTATUS nt = ObReferenceObjectByHandle(FileHandle,0,0,UserMode,&pF,NULL); if (nt == STATUS_SUCCESS) { DPRINT("\nnHookReadFile %S", pF->FileName.Buffer); ObDereferenceObject(&pF); } if (nt == STATUS_INVALID_HANDLE) { DPRINT("STATUS_INVALID_HANDLE"); } /* PFILE_OBJECT pObject; NTSTATUS nts = ObReferenceObjectByHandle(FileHandle, DesiredAccess, *IoFileObjectType, UserMode, &pObject,NULL); switch (nts) { case STATUS_SUCCESS: { DPRINT("ok"); break; } case STATUS_OBJECT_TYPE_MISMATCH: { DPRINT("STATUS_OBJECT_TYPE_MISMATCH"); break; } case STATUS_ACCESS_DENIED: { DPRINT("STATUS_ACCESS_DENIED"); break; } case STATUS_INVALID_HANDLE: { DPRINT("STATUS_INVALID_HANDLE"); break; } }*/ /*NTSTATUS nts = ZwQueryInformationFile(FileHandle, psb, &fni, sizeof(fni), FileNameInformation); if (nts == STATUS_INVALID_HANDLE) { DPRINT("InvalidHandle: 0x%x", FileHandle); } if (nts == STATUS_SUCCESS) { DPRINT("ok"); }*/ } __except(1) { DPRINT("FUCK"); } } return ret; }
>> ObReferenceObjectByHandle, ZwQueryInformationFile получения имени файла дает STATUS_INVALID_HANDLE потому что им нужно передавать не указатель на хендл, а сам хендл =) т.е. так: ObReferenceObjectByHandle(*FileHandle, ...);
>> Почему в пути к файлу нету диска, а только имя? e.g. \Program Files\Winamp\winamp.exe хз, по идее должно быть \Device\HarddiskVolumeX\Program Files\Winamp\winamp.exe