Anyone seen a situation where ObQueryNameString
doesn't return?
I am enumerating all open handles on the system and
calling ObQueryNameString for each one of type file
(0x1C). Then I am KdPrint'ing out the returned object
name.
It appears as though I reach a particular handle and
the function call never returns.
Thanks,
Randy Cook
Lucid Systems Inc.
Here is some code:
NTSTATUS DumpOpenFiles(VOID)
{
PVOID handleBuffer;
ULONG size, reqSize;
NTSTATUS status;
ULONG numEntries, i;
PSYSTEM_HANDLE_INFORMATION pHandleInfo;
PUNICODE_STRING uniStrBuff;
size = 1;
//
// Get an snapshot of all open handles on the system
//
handleBuffer = myMalloc(size, FALSE, 0, FALSE);
if (handleBuffer == NULL)
{
return STATUS_NO_MEMORY;
}
status =
ZwQuerySystemInformation(SystemHandleInformation,
handleBuffer, size, &reqSize);
if (status == STATUS_INFO_LENGTH_MISMATCH)
{
KdPrint(("Buffer is not the right size\n"));
myFree(handleBuffer);
size = reqSize;
handleBuffer = myMalloc(size, FALSE, HBUFFER_TAG,
FALSE);
if (handleBuffer == NULL)
{
return STATUS_NO_MEMORY;
}
status =
ZwQuerySystemInformation(SystemHandleInformation,
handleBuffer, size, &reqSize);
if (!NT_SUCCESS(status))
{
KdPrint(("ZwQuerySystemInformation error again:
%X\n", status));
//
// Clean up
//
myFree(handleBuffer);
return status;
}
}
else if (!NT_SUCCESS(status))
{
KdPrint(("ZwQuerySystemInformation error: %X\n",
status));
//
// Clean up
//
myFree(handleBuffer);
return status;
}
numEntries = ((PULONG)handleBuffer)[0];
KdPrint(("Number of entries: %X\n", numEntries));
(PULONG)pHandleInfo = ((PULONG)handleBuffer) + 1;
//
// Get some space for the name
//
uniStrBuff = myMalloc(sizeof(UNICODE_STRING) +
MY_MAX_UNI_STR_SIZE_BYTES, FALSE, 0, FALSE);
if (uniStrBuff == NULL)
{
//
// Clean up
//
myFree(handleBuffer);
return STATUS_NO_MEMORY;
}
//
// For each handle, get the name
//
for (i = 0; i < numEntries; i++)
{
if (pHandleInfo->ObjectTypeNumber ==
MY_NT_HANDLE_TYPE_FILE)
{
KdPrint(("Total: %X Current: %X PID: %X TYPE: %X
FLAGS: %X HANDLE: %X\n OBJECT: %X ACCESS: %X\n",
numEntries,
i,
pHandleInfo->ProcessId,
pHandleInfo->ObjectTypeNumber,
pHandleInfo->Flags,
pHandleInfo->Handle,
pHandleInfo->Object,
pHandleInfo->GrantedAccess));
status = ObQueryNameString(pHandleInfo->Object,
uniStrBuff, MY_MAX_UNI_STR_SIZE_BYTES, &size);
if (NT_SUCCESS(status))
{
KdPrint(("%X Pid: %X Type: %X File: %ws\n",
i,
pHandleInfo->ProcessId,
pHandleInfo->ObjectTypeNumber,
uniStrBuff->Buffer));
}
else
{
KdPrint(("Error: %X\n", status));
}
}
pHandleInfo++;
}
//
// Clean up
//
myFree(uniStrBuff);
myFree(handleBuffer);
return STATUS_SUCCESS;
}
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.