IopQueryProcessIdsUsingFile
NTSTATUS __stdcall IopQueryProcessIdsUsingFile(
_FILE_OBJECT *FileObject,
_FILE_PROCESS_IDS_USING_FILE_INFORMATION *Puffer,
UINT64 PufferLength,
UINT64 *OutputSize){
_FILE_PROCESS_IDS_USING_FILE_INFORMATION *v6;
unsigned int v7;
unsigned int v8;
_EPROCESS *i;
_LIST_ENTRY *NextProcess;
_EPROCESS *v11;
_HANDLE_TABLE *v12;
char v13;
_FILE_OBJECT *v15;
__int64 v16;
v6 = Puffer + 1;
v7 = (unsigned int)(PufferLength - 8) >> 3;
v8 = 0;
v16 = 0i64;
Puffer->NumberOfProcessIdsInList = 0;
v15 = FileObject;
for( i = 0i64; ; i = v11 )
{
NextProcess = PsGetNextProcess(i);
v11 = (_EPROCESS *)NextProcess;
if( !NextProcess )
break;
v12 = ObReferenceProcessHandleTable((_EPROCESS *)NextProcess);
if( v12 )
{
LOBYTE(v16) = v11 == KeGetCurrentThread()->ApcState.Process;
v13 = ExEnumHandleTable(
v12,
(__int64(__fastcall *)(_HANDLE_TABLE *, _HANDLE_TABLE_ENTRY *, _EXHANDLE, __int64))IopIsFileOpenOrSection,
(__int64)&v15,
0i64);
ExReleaseRundownProtection(&v11->RundownProtect);
}
else
{
v13 = 0;
}
if( v13 || MmIsFileMapped(v11, FileObject) )
{
if( v8 < v7 )
{
*v6 = (_FILE_PROCESS_IDS_USING_FILE_INFORMATION)v11->UniqueProcessId;
++Puffer->NumberOfProcessIdsInList;
++v6;
}
++v8;
}
}
*(_DWORD *)OutputSize = 8 * v8 + 8;
return v7 < v8 ? 0xC0000004 : 0;
}Referenced by:
NtQueryInformationFile