00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
#include "cmp.h"
00030 
#include <stdio.h>
00031 
#include <stdlib.h>
00032 
#include <string.h>
00033 
00034 #define WORK_SIZE   1024
00035 
00036 
void __cdecl 
main(
int, 
char *);
00037 
void processargs();
00038 
00039 UNICODE_STRING  
WorkName;
00040 WCHAR           
workbuffer[
WORK_SIZE];
00041 
00042 
00043 
00044 UNICODE_STRING  
WorkName2;
00045 WCHAR           
workbuffer2[
WORK_SIZE];
00046 
00047 
00048 UCHAR       
Buffer[1024*64];
00049 
00050 ULONG       
InfoType = KeyValueFullInformation;
00051 ULONG       
BufferSize = -1;
00052 
00053 
void
00054 __cdecl 
main(
00055     
int argc,
00056     
char *argv[]
00057     )
00058 {
00059     
NTSTATUS status;
00060     OBJECT_ATTRIBUTES 
ObjectAttributes;
00061     HANDLE          BaseHandle;
00062     ULONG   Sizes[] = { 
sizeof(KEY_VALUE_BASIC_INFORMATION),
00063                         
sizeof(KEY_VALUE_FULL_INFORMATION) };
00064     ULONG       ResultLength;
00065     PKEY_VALUE_BASIC_INFORMATION pbasic;
00066     PKEY_VALUE_FULL_INFORMATION  pfull;
00067     PKEY_VALUE_PARTIAL_INFORMATION  ppartial;
00068 
00069     
00070     
00071     
00072 
00073     
WorkName.MaximumLength = 
WORK_SIZE;
00074     
WorkName.Length = 0
L;
00075     
WorkName.Buffer = &(
workbuffer[0]);
00076 
00077     
WorkName2.MaximumLength = 
WORK_SIZE;
00078     
WorkName2.Length = 0
L;
00079     
WorkName2.Buffer = &(
workbuffer2[0]);
00080 
00081     
processargs(argc, argv);
00082 
00083 
00084     
00085     
00086     
00087 
00088     printf(
"rtqkey: starting\n");
00089 
00090     InitializeObjectAttributes(
00091         &
ObjectAttributes,
00092         &
WorkName,
00093         0,
00094         (HANDLE)
NULL,
00095         
NULL
00096         );
00097     
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
00098 
00099     status = 
NtOpenKey(
00100                 &BaseHandle,
00101                 KEY_QUERY_VALUE,
00102                 &
ObjectAttributes
00103                 );
00104     
if (!
NT_SUCCESS(status)) {
00105         printf(
"rtqkey: t0: %08lx\n", status);
00106         
exit(1);
00107     }
00108 
00109     
00110     
00111     
00112     RtlFillMemory((PVOID)&(
Buffer[0]), 1024*64, 0xaa);
00113 
00114     
if (
BufferSize == -1) {
00115         
BufferSize = Sizes[
InfoType];
00116     }
00117 
00118     status = 
NtQueryValueKey(
00119                 BaseHandle,
00120                 &
WorkName2,
00121                 
InfoType,
00122                 (PVOID)&(
Buffer[0]),
00123                 
BufferSize,
00124                 &ResultLength
00125                 );
00126 
00127     printf(
"status = %08lx  ResultLength = %08lx\n", status, ResultLength);
00128     
switch (
InfoType) {
00129     
case KeyValueBasicInformation:
00130         pbasic = (PKEY_VALUE_BASIC_INFORMATION)
Buffer;
00131         printf(
"TitleIndex: %08lx\n", pbasic->TitleIndex);
00132         printf(
"      Type: %08lx\n", pbasic->Type);
00133         printf(
"NameLength: %08lx\n", pbasic->NameLength);
00134         printf(
"      Name: '%.*ws'\n", pbasic->NameLength/2, &(pbasic->Name));
00135         
break;
00136 
00137     
case KeyValueFullInformation:
00138         pfull = (PKEY_VALUE_FULL_INFORMATION)
Buffer;
00139         printf(
"TitleIndex: %08lx\n", pfull->TitleIndex);
00140         printf(
"      Type: %08lx\n", pfull->Type);
00141         printf(
"DataOffset: %08lx\n", pfull->DataOffset);
00142         printf(
"DataLength: %08lx\n", pfull->DataLength);
00143         printf(
"NameLength: %08lx\n", pfull->NameLength);
00144         printf(
"      Name: '%.*ws'\n", pfull->NameLength/2, &(pfull->Name));
00145         printf(
"      Data: '%.*ws'\n", pfull->DataLength/2,
00146                     ((PUCHAR)pfull + pfull->DataOffset) );
00147         
break;
00148 
00149     
case KeyValuePartialInformation:
00150         ppartial = (PKEY_VALUE_PARTIAL_INFORMATION)
Buffer;
00151         printf(
"TitleIndex: %08lx\n", ppartial->TitleIndex);
00152         printf(
"      Type: %08lx\n", ppartial->Type);
00153         printf(
"DataLength: %08lx\n", ppartial->DataLength);
00154         printf(
"      Data: '%.*ws'\n", ppartial->DataLength/2,
00155                     ((PUCHAR)&(ppartial->Data)));
00156         
break;
00157     }
00158 
00159     
NtClose(BaseHandle);
00160     
exit(0);
00161 }
00162 
00163 
void
00164 processargs(
00165     
int argc,
00166     
char *argv[]
00167     )
00168 {
00169     ANSI_STRING temp;
00170 
00171     
if ( (argc < 2) )
00172     {
00173         printf(
"Usage: %s <KeyPath> [infotype] [bufferlen]\n",
00174                 argv[0]);
00175         
exit(1);
00176     }
00177 
00178     
RtlInitAnsiString(
00179         &temp,
00180         argv[1]
00181         );
00182 
00183     
RtlAnsiStringToUnicodeString(
00184         &
WorkName,
00185         &temp,
00186         
TRUE
00187         );
00188 
00189     
RtlInitAnsiString(
00190         &temp,
00191         argv[2]
00192         );
00193 
00194     
RtlAnsiStringToUnicodeString(
00195         &
WorkName2,
00196         &temp,
00197         
TRUE
00198         );
00199 
00200     
if (argc > 3) {
00201         
InfoType = atoi(argv[3]);
00202     }
00203 
00204     
if (argc > 4) {
00205         
BufferSize = atoi(argv[4]);
00206     }
00207 
00208     
return;
00209 }