mirror of
https://github.com/reactos/reactos.git
synced 2024-08-29 22:58:34 +00:00
239 lines
4.4 KiB
C
239 lines
4.4 KiB
C
/*
|
|
* reactos/apps/lpc/dumpinfo.c
|
|
*
|
|
* ReactOS Operating System
|
|
*
|
|
* Dump a kernel object's attributes by its handle.
|
|
*
|
|
* 19990627 (Emanuele Aliberti)
|
|
* Initial implementation.
|
|
* 19990704 (EA)
|
|
* Added code to find the basic information buffer size
|
|
* for the LPC port object.
|
|
* 19990710 (EA)
|
|
*
|
|
*/
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ddk/ntddk.h>
|
|
|
|
#define BUF_SIZE 1024
|
|
#define MAX_BASIC_INFO_SIZE 512
|
|
|
|
|
|
extern
|
|
NTSTATUS
|
|
(WINAPI * QueryObject)(
|
|
IN HANDLE ObjectHandle,
|
|
IN CINT ObjectInformationClass,
|
|
OUT PVOID ObjectInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ResultLength
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
(WINAPI * QueryInformationPort)(
|
|
IN HANDLE PortHandle,
|
|
IN CINT PortInformationClass, /* guess */
|
|
OUT PVOID PortInformation, /* guess */
|
|
IN ULONG PortInformationLength, /* guess */
|
|
OUT PULONG ReturnLength /* guess */
|
|
);
|
|
|
|
|
|
/*
|
|
static
|
|
VOID
|
|
DumpBuffer(
|
|
char *Name,
|
|
BYTE *buffer,
|
|
ULONG size
|
|
)
|
|
{
|
|
register ULONG i = 0;
|
|
|
|
printf("%s [%d] = ",Name,size);
|
|
for ( i = 0;
|
|
i != size;
|
|
++i
|
|
)
|
|
{
|
|
printf("%02X",buffer[i]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
*/
|
|
|
|
VOID
|
|
DumpInfo (
|
|
LPCWSTR Name,
|
|
NTSTATUS Status,
|
|
LPCWSTR Comment,
|
|
HANDLE Port
|
|
)
|
|
{
|
|
BYTE ObjectInformation [BUF_SIZE] = {0};
|
|
ULONG ResultLength;
|
|
|
|
wprintf(
|
|
L"Port \"%s\" %s:\n",
|
|
Name,
|
|
Comment
|
|
);
|
|
|
|
printf("\tStatus = %08X\n",Status);
|
|
printf("\tPort = %08X\n\n",Port);
|
|
/*
|
|
* Query object information.
|
|
*/
|
|
printf("Basic Information:\n");
|
|
Status = QueryObject(
|
|
Port,
|
|
ObjectBasicInformation,
|
|
ObjectInformation,
|
|
sizeof (LPC_PORT_BASIC_INFORMATION),
|
|
& ResultLength
|
|
);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
PLPC_PORT_BASIC_INFORMATION i;
|
|
|
|
i = (PLPC_PORT_BASIC_INFORMATION) ObjectInformation;
|
|
|
|
printf( "\tUnknown01 = 0x%08X\n", i->Unknown0 );
|
|
printf( "\tUnknown02 = 0x%08X\n", i->Unknown1 );
|
|
printf( "\tUnknown03 = 0x%08X\n", i->Unknown2 );
|
|
printf( "\tUnknown04 = 0x%08X\n", i->Unknown3 );
|
|
printf( "\tUnknown05 = 0x%08X\n", i->Unknown4 );
|
|
printf( "\tUnknown06 = 0x%08X\n", i->Unknown5 );
|
|
printf( "\tUnknown07 = 0x%08X\n", i->Unknown6 );
|
|
printf( "\tUnknown08 = 0x%08X\n", i->Unknown7 );
|
|
printf( "\tUnknown09 = 0x%08X\n", i->Unknown8 );
|
|
printf( "\tUnknown10 = 0x%08X\n", i->Unknown9 );
|
|
printf( "\tUnknown11 = 0x%08X\n", i->Unknown10 );
|
|
printf( "\tUnknown12 = 0x%08X\n", i->Unknown11 );
|
|
printf( "\tUnknown13 = 0x%08X\n", i->Unknown12 );
|
|
printf( "\tUnknown14 = 0x%08X\n", i->Unknown13 );
|
|
}
|
|
else
|
|
{
|
|
printf("\tStatus = %08X\n",Status);
|
|
}
|
|
printf("Type Information:\n");
|
|
Status = QueryObject(
|
|
Port,
|
|
ObjectTypeInformation,
|
|
ObjectInformation,
|
|
sizeof ObjectInformation,
|
|
& ResultLength
|
|
);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
OBJECT_TYPE_INFORMATION * i;
|
|
|
|
i = (OBJECT_TYPE_INFORMATION *) ObjectInformation;
|
|
|
|
wprintf(
|
|
L"\tName: \"%s\"\n",
|
|
(i->Name.Length ? i->Name.Buffer : L"")
|
|
);
|
|
/*
|
|
FIXME: why this always raise an access violation exception?
|
|
wprintf(
|
|
L"\tType: \"%s\"\n",
|
|
(i->Type.Length ? i->Type.Buffer : L"")
|
|
);
|
|
/**/
|
|
printf(
|
|
"\tTotal Handles: %d\n",
|
|
i->TotalHandles
|
|
);
|
|
printf(
|
|
"\tReference Count: %d\n",
|
|
i->ReferenceCount
|
|
);
|
|
}
|
|
else
|
|
{
|
|
printf("\tStatus = %08X\n",Status);
|
|
}
|
|
printf("Name Information:\n");
|
|
Status = QueryObject(
|
|
Port,
|
|
ObjectNameInformation,
|
|
ObjectInformation,
|
|
sizeof ObjectInformation,
|
|
& ResultLength
|
|
);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
OBJECT_NAME_INFORMATION * i;
|
|
|
|
i = (OBJECT_NAME_INFORMATION *) ObjectInformation;
|
|
wprintf(
|
|
L"\tName: \"%s\"\n",
|
|
(i->Name.Length ? i->Name.Buffer : L"")
|
|
);
|
|
}
|
|
else
|
|
{
|
|
printf("\tStatus = %08X\n",Status);
|
|
}
|
|
printf("Data Information:\n");
|
|
Status = QueryObject(
|
|
Port,
|
|
ObjectDataInformation,
|
|
ObjectInformation,
|
|
sizeof ObjectInformation,
|
|
& ResultLength
|
|
);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
OBJECT_DATA_INFORMATION * i;
|
|
|
|
i = (OBJECT_DATA_INFORMATION *) ObjectInformation;
|
|
printf(
|
|
"\tInherit Handle: %s\n",
|
|
(i->bInheritHandle ? "TRUE" : "FALSE")
|
|
);
|
|
printf(
|
|
"\tProtect from Close: %s\n",
|
|
(i->bProtectFromClose ? "TRUE" : "FALSE")
|
|
);
|
|
}
|
|
else
|
|
{
|
|
printf("\tStatus = %08X\n",Status);
|
|
}
|
|
//---
|
|
printf("Port Information:\n");
|
|
/* Status = QueryInformationPort(
|
|
Port,
|
|
1, /* info class * /
|
|
ObjectInformation,
|
|
sizeof ObjectInformation,
|
|
& ResultLength
|
|
);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
DWORD * i = ObjectInformation;
|
|
int j = 0;
|
|
|
|
while (j < ResultLength / sizeof (DWORD))
|
|
{
|
|
printf("\t%08X\n",i[j]);
|
|
++j;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("\tStatus = %08X\n",Status);
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
/* EOF */
|