1 /*
2 * reactos/apps/lpc/dumpinfo.c
3 *
4 * ReactOS Operating System
5 *
6 * Dump a kernel object's attributes by its handle.
7 *
8 * 19990627 (Emanuele Aliberti)
9 * Initial implementation.
10 * 19990704 (EA)
11 * Added code to find the basic information buffer size
12 * for the LPC port object.
13 * 19990710 (EA)
14 *
15 */
16 #include <windows.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <ddk/ntddk.h>
20
21 #define BUF_SIZE 1024
22 #define MAX_BASIC_INFO_SIZE 512
23
24
25 extern
26 NTSTATUS
27 (WINAPI * QueryObject)(
28 IN HANDLE ObjectHandle,
29 IN CINT ObjectInformationClass,
30 OUT PVOID ObjectInformation,
31 IN ULONG Length,
32 OUT PULONG ResultLength
33 );
34
35 extern
36 NTSTATUS
37 (WINAPI * QueryInformationPort)(
38 IN HANDLE PortHandle,
39 IN CINT PortInformationClass, /* guess */
40 OUT PVOID PortInformation, /* guess */
41 IN ULONG PortInformationLength, /* guess */
42 OUT PULONG ReturnLength /* guess */
43 );
44
45
46 /*
47 static
48 VOID
49 DumpBuffer(
50 char *Name,
51 BYTE *buffer,
52 ULONG size
53 )
54 {
55 register ULONG i = 0;
56
57 printf("%s [%d] = ",Name,size);
58 for ( i = 0;
59 i != size;
60 ++i
61 )
62 {
63 printf("%02X",buffer[i]);
64 }
65 printf("\n");
66 }
67 */
68
69 VOID
DumpInfo(LPCWSTR Name,NTSTATUS Status,LPCWSTR Comment,HANDLE Port)70 DumpInfo (
71 LPCWSTR Name,
72 NTSTATUS Status,
73 LPCWSTR Comment,
74 HANDLE Port
75 )
76 {
77 BYTE ObjectInformation [BUF_SIZE] = {0};
78 ULONG ResultLength;
79
80 wprintf(
81 L"Port \"%s\" %s:\n",
82 Name,
83 Comment
84 );
85
86 printf("\tStatus = %08X\n",Status);
87 printf("\tPort = %08X\n\n",Port);
88 /*
89 * Query object information.
90 */
91 printf("Basic Information:\n");
92 Status = QueryObject(
93 Port,
94 ObjectBasicInformation,
95 ObjectInformation,
96 sizeof (LPC_PORT_BASIC_INFORMATION),
97 & ResultLength
98 );
99 if (Status == STATUS_SUCCESS)
100 {
101 PLPC_PORT_BASIC_INFORMATION i;
102
103 i = (PLPC_PORT_BASIC_INFORMATION) ObjectInformation;
104
105 printf( "\tUnknown01 = 0x%08X\n", i->Unknown0 );
106 printf( "\tUnknown02 = 0x%08X\n", i->Unknown1 );
107 printf( "\tUnknown03 = 0x%08X\n", i->Unknown2 );
108 printf( "\tUnknown04 = 0x%08X\n", i->Unknown3 );
109 printf( "\tUnknown05 = 0x%08X\n", i->Unknown4 );
110 printf( "\tUnknown06 = 0x%08X\n", i->Unknown5 );
111 printf( "\tUnknown07 = 0x%08X\n", i->Unknown6 );
112 printf( "\tUnknown08 = 0x%08X\n", i->Unknown7 );
113 printf( "\tUnknown09 = 0x%08X\n", i->Unknown8 );
114 printf( "\tUnknown10 = 0x%08X\n", i->Unknown9 );
115 printf( "\tUnknown11 = 0x%08X\n", i->Unknown10 );
116 printf( "\tUnknown12 = 0x%08X\n", i->Unknown11 );
117 printf( "\tUnknown13 = 0x%08X\n", i->Unknown12 );
118 printf( "\tUnknown14 = 0x%08X\n", i->Unknown13 );
119 }
120 else
121 {
122 printf("\tStatus = %08X\n",Status);
123 }
124 printf("Type Information:\n");
125 Status = QueryObject(
126 Port,
127 ObjectTypeInformation,
128 ObjectInformation,
129 sizeof ObjectInformation,
130 & ResultLength
131 );
132 if (Status == STATUS_SUCCESS)
133 {
134 OBJECT_TYPE_INFORMATION * i;
135
136 i = (OBJECT_TYPE_INFORMATION *) ObjectInformation;
137
138 wprintf(
139 L"\tName: \"%s\"\n",
140 (i->Name.Length ? i->Name.Buffer : L"")
141 );
142 /*
143 FIXME: why this always raise an access violation exception?
144 wprintf(
145 L"\tType: \"%s\"\n",
146 (i->Type.Length ? i->Type.Buffer : L"")
147 );
148 /**/
149 printf(
150 "\tTotal Handles: %d\n",
151 i->TotalHandles
152 );
153 printf(
154 "\tReference Count: %d\n",
155 i->ReferenceCount
156 );
157 }
158 else
159 {
160 printf("\tStatus = %08X\n",Status);
161 }
162 printf("Name Information:\n");
163 Status = QueryObject(
164 Port,
165 ObjectNameInformation,
166 ObjectInformation,
167 sizeof ObjectInformation,
168 & ResultLength
169 );
170 if (Status == STATUS_SUCCESS)
171 {
172 OBJECT_NAME_INFORMATION * i;
173
174 i = (OBJECT_NAME_INFORMATION *) ObjectInformation;
175 wprintf(
176 L"\tName: \"%s\"\n",
177 (i->Name.Length ? i->Name.Buffer : L"")
178 );
179 }
180 else
181 {
182 printf("\tStatus = %08X\n",Status);
183 }
184 printf("Data Information:\n");
185 Status = QueryObject(
186 Port,
187 ObjectDataInformation,
188 ObjectInformation,
189 sizeof ObjectInformation,
190 & ResultLength
191 );
192 if (Status == STATUS_SUCCESS)
193 {
194 OBJECT_DATA_INFORMATION * i;
195
196 i = (OBJECT_DATA_INFORMATION *) ObjectInformation;
197 printf(
198 "\tInherit Handle: %s\n",
199 (i->bInheritHandle ? "TRUE" : "FALSE")
200 );
201 printf(
202 "\tProtect from Close: %s\n",
203 (i->bProtectFromClose ? "TRUE" : "FALSE")
204 );
205 }
206 else
207 {
208 printf("\tStatus = %08X\n",Status);
209 }
210 //---
211 printf("Port Information:\n");
212 /* Status = QueryInformationPort(
213 Port,
214 1, /* info class * /
215 ObjectInformation,
216 sizeof ObjectInformation,
217 & ResultLength
218 );
219 if (Status == STATUS_SUCCESS)
220 {
221 DWORD * i = ObjectInformation;
222 int j = 0;
223
224 while (j < ResultLength / sizeof (DWORD))
225 {
226 printf("\t%08X\n",i[j]);
227 ++j;
228 }
229 }
230 else
231 {
232 printf("\tStatus = %08X\n",Status);
233 }
234 */
235 }
236
237
238 /* EOF */
239