First off, thanks to all that helped me out.
Alex, your blogs are very informative.
Now, it seems to work and I must go get the Volume Serial Number now but, I have another question.
here is the code:
//
// Check if an object exists on disk and get its ID if it does.
// return TRUE if we got it
// return FALSE if we did not
// set ObjExists = TRUE if the target exists.
// set ObjExists = FALSE if we does not.
//
static BOOLEAN GetTargetID(PCFLT_RELATED_OBJECTS FrObjs, PUNICODE_STRING UniPath, BOOLEAN *ObjExists)
{
NTSTATUS Status;
FILE_INTERNAL_INFORMATION FileInfo;
OBJECT_ATTRIBUTES FileObjAttr;
HANDLE FileHandle;
IO_STATUS_BLOCK FileISB;
ULONG FileInfoLen;
*ObjExists = FALSE; // default to ‘does not exist’…
InitializeObjectAttributes(&FileObjAttr, UniPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
if(IoGetTopLevelIrp() != NULL) // If IoGetTopLevelIrp() returns != NULL, do not call as FltQueryInformationFile() can cause a system deadlock.
{
LogWrite(“GetTargetID: ???(BAD IRP) %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
*ObjExists = FALSE;
goto GetTargetID_FALSE;
}
Status = FltCreateFile( gFilterHandle, FrObjs->Instance, &FileHandle, FILE_READ_ATTRIBUTES, &FileObjAttr, &FileISB, NULL,
FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0, IO_FORCE_ACCESS_CHECK);
if(!NT_SUCCESS(Status))
{
if(FileISB.Information == FILE_DOES_NOT_EXIST) // this does not seem to work. But, just in case.
{
*ObjExists = FALSE;
LogWrite(“GetTargetID: no %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
goto GetTargetID_FALSE;
}
if(Status == STATUS_OBJECT_NAME_NOT_FOUND) // this is expected if the target is not there.
{
*ObjExists = FALSE;
LogWrite(“GetTargetID: NO %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
goto GetTargetID_FALSE;
}
else if(Status == STATUS_SHARING_VIOLATION) // Hmm, cant get object ID… Bummer.
{
*ObjExists = TRUE;
LogWrite(“GetTargetID: YES STATUS_SHARING_VIOLATION %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
goto GetTargetID_FALSE;
}
else
LogWrite(“GetTargetID: ???(%X) %.*ls\r\n”, Status, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
*ObjExists = FALSE; // got some unexpected error.
goto GetTargetID_FALSE;
}
*ObjExists = TRUE;
FileInfoLen = 0;
memset(&FileInfo, 0, sizeof(FileInfo));
//Status = FltQueryInformationFile(FrObjs->Instance, FrObjs->FileObject, &FileInfo, sizeof(FileInfo), FileInternalInformation, &FileInfoLen);
Status = ZwQueryInformationFile(FileHandle, &FileISB, &FileInfo, sizeof(FileInfo), FileInternalInformation);
if(!NT_SUCCESS(Status))
{
if(Status == STATUS_INVALID_DEVICE_REQUEST)
LogWrite(“GetTargetID: YES STATUS_INVALID_DEVICE_REQUEST %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
else if(Status == STATUS_INVALID_PARAMETER)
LogWrite(“GetTargetID: YES STATUS_INVALID_PARAMETER %.*ls\r\n”, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
else
LogWrite(“GetTargetID: YES(%X) %.*ls\r\n”, Status, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
FltClose(FileHandle);
goto GetTargetID_FALSE;
}
FltClose(FileHandle);
LogWrite(“GetTargetID: ID(%8.8X-%8.8X) %.*ls\r\n”, FileInfo.IndexNumber.HighPart, FileInfo.IndexNumber.LowPart, UniPath->Length/sizeof(WCHAR), UniPath->Buffer);
return TRUE;
GetTargetID_FALSE:
return FALSE;
}
The out put from Zwxxx is below.
GetTargetID: ID(003F0000-000022C5) \Device\HarddiskVolume1\WINDOWS\Prefetch\FLTMC.EXE-14D13
GetTargetID: ID(00020000-0000F724) \Device\HarddiskVolume1\WINDOWS\AppPatch\acgenral.dll
GetTargetID: ID(00020000-0000F1F7) \Device\HarddiskVolume1\WINDOWS\AppPatch\drvmain.sdb
GetTargetID: ID(003D0000-00004D6A) \Device\HarddiskVolume1\WINDOWS\AppPatch\sysmain.sdb
GetTargetID: ID(00070000-00001D0A) \Device\HarddiskVolume1\WINDOWS\system32\advapi32.dll
GetTargetID: ID(00060000-00006F0A) \Device\HarddiskVolume1\WINDOWS\system32\comctl32.dll
GetTargetID: ID(00010000-000000ED) \Device\HarddiskVolume1\WINDOWS\system32\ctype.nls
GetTargetID: ID(000D0000-00014C30) \Device\HarddiskVolume1\WINDOWS\system32\drivers\VIEWINT
GetTargetID: ID(00020000-0001007B) \Device\HarddiskVolume1\WINDOWS\system32\fltlib.dll
GetTargetID: ID(00020000-0001007A) \Device\HarddiskVolume1\WINDOWS\system32\fltmc.exe
GetTargetID: ID(00070000-00005B57) \Device\HarddiskVolume1\WINDOWS\system32\gdi32.dll
GetTargetID: ID(000C0000-0000575C) \Device\HarddiskVolume1\WINDOWS\system32\kernel32.dll
GetTargetID: ID(00040000-00009144) \Device\HarddiskVolume1\WINDOWS\system32\locale.nls
GetTargetID: ID(00020000-0000F46A) \Device\HarddiskVolume1\WINDOWS\system32\msacm32.dll
GetTargetID: ID(00020000-0000F414) \Device\HarddiskVolume1\WINDOWS\system32\msvcrt.dll
GetTargetID: ID(000D0000-00005D56) \Device\HarddiskVolume1\WINDOWS\system32\netapi32.dll
GetTargetID: ID(00350000-0000254D) \Device\HarddiskVolume1\WINDOWS\system32\ntdll.dll
GetTargetID: ID(00170000-00006117) \Device\HarddiskVolume1\WINDOWS\system32\ole32.dll
GetTargetID: ID(00020000-0000F1DB) \Device\HarddiskVolume1\WINDOWS\system32\oleaut32.dll
GetTargetID: ID(00020000-0000F38C) \Device\HarddiskVolume1\WINDOWS\system32\psapi.dll
GetTargetID: ID(00020000-0000F366) \Device\HarddiskVolume1\WINDOWS\system32\rdpsnd.dll
GetTargetID: ID(00240000-00005251) \Device\HarddiskVolume1\WINDOWS\system32\rpcrt4.dll
GetTargetID: ID(00080000-00006A21) \Device\HarddiskVolume1\WINDOWS\system32\secur32.dll
GetTargetID: ID(000F0000-000028C9) \Device\HarddiskVolume1\WINDOWS\system32\shell32.dll
GetTargetID: ID(00020000-0000F318) \Device\HarddiskVolume1\WINDOWS\system32\shimeng.dll
GetTargetID: ID(00060000-00006D67) \Device\HarddiskVolume1\WINDOWS\system32\shlwapi.dll
GetTargetID: ID(00010000-000000EE) \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls
GetTargetID: ID(00040000-00009124) \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls
GetTargetID: ID(00010000-000000DD) \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls
GetTargetID: ID(00020000-0000F2A9) \Device\HarddiskVolume1\WINDOWS\system32\user32.dll
GetTargetID: ID(00020000-0000F2A8) \Device\HarddiskVolume1\WINDOWS\system32\userenv.dll
GetTargetID: ID(00020000-0000F2A4) \Device\HarddiskVolume1\WINDOWS\system32\uxtheme.dll
GetTargetID: ID(00020000-0000F29C) \Device\HarddiskVolume1\WINDOWS\system32\version.dll
GetTargetID: ID(00020000-0000F27E) \Device\HarddiskVolume1\WINDOWS\system32\winmm.dll
GetTargetID: ID(00020000-0000F277) \Device\HarddiskVolume1\WINDOWS\system32\winsta.dll
As yo can see, I was trying to use FltQueryInformationFile() but is ALWAYS returned STATUS_INVALID_PARAMETER
so, I switched to ZwQueryInformationFile() and now it works fine.
But, why was Ftlxxx returning the error ?
Thanks,
Jerry