/*++ Copyright (c) 1991 Microsoft Corporation Module Name: rtqval.c Abstract: NT level registry api test program, basic non-error paths. Do a query on a value. rtqval [infotypenumber] [bufferlength] Example: rtqval \REGISTRY\MACHINE\TEST\bigkey value1 1 100 Author: Bryan Willman (bryanwi) 9-Apr-92 Revision History: --*/ #include "cmp.h" #include #include #include #define WORK_SIZE 1024 void __cdecl main(int, char *); void processargs(); UNICODE_STRING WorkName; WCHAR workbuffer[WORK_SIZE]; UNICODE_STRING WorkName2; WCHAR workbuffer2[WORK_SIZE]; UCHAR Buffer[1024*64]; ULONG InfoType = KeyValueFullInformation; ULONG BufferSize = -1; void __cdecl main( int argc, char *argv[] ) { NTSTATUS status; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE BaseHandle; ULONG Sizes[] = { sizeof(KEY_VALUE_BASIC_INFORMATION), sizeof(KEY_VALUE_FULL_INFORMATION) }; ULONG ResultLength; PKEY_VALUE_BASIC_INFORMATION pbasic; PKEY_VALUE_FULL_INFORMATION pfull; PKEY_VALUE_PARTIAL_INFORMATION ppartial; // Process args WorkName.MaximumLength = WORK_SIZE; WorkName.Length = 0L; WorkName.Buffer = &(workbuffer[0]); WorkName2.MaximumLength = WORK_SIZE; WorkName2.Length = 0L; WorkName2.Buffer = &(workbuffer2[0]); processargs(argc, argv); // Set up and open KeyPath printf("rtqkey: starting\n"); InitializeObjectAttributes(&ObjectAttributes, &WorkName, 0, (HANDLE)NULL, NULL); ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE; status = NtOpenKey(&BaseHandle, KEY_QUERY_VALUE, &ObjectAttributes); if (!NT_SUCCESS(status)) { printf("rtqkey: t0: %08lx\n", status); exit(1); } // make test call RtlFillMemory((PVOID)&(Buffer[0]), 1024*64, 0xaa); if (BufferSize == -1) { BufferSize = Sizes[InfoType]; } status = NtQueryValueKey(BaseHandle, &WorkName2, InfoType, (PVOID)&(Buffer[0]), BufferSize, &ResultLength); printf("status = %08lx ResultLength = %08lx\n", status, ResultLength); switch (InfoType) { case KeyValueBasicInformation: pbasic = (PKEY_VALUE_BASIC_INFORMATION)Buffer; printf("TitleIndex: %08lx\n", pbasic->TitleIndex); printf(" Type: %08lx\n", pbasic->Type); printf("NameLength: %08lx\n", pbasic->NameLength); printf(" Name: '%.*ws'\n", pbasic->NameLength/2, &(pbasic->Name)); break; case KeyValueFullInformation: pfull = (PKEY_VALUE_FULL_INFORMATION)Buffer; printf("TitleIndex: %08lx\n", pfull->TitleIndex); printf(" Type: %08lx\n", pfull->Type); printf("DataOffset: %08lx\n", pfull->DataOffset); printf("DataLength: %08lx\n", pfull->DataLength); printf("NameLength: %08lx\n", pfull->NameLength); printf(" Name: '%.*ws'\n", pfull->NameLength/2, &(pfull->Name)); printf(" Data: '%.*ws'\n", pfull->DataLength/2, ((PUCHAR)pfull + pfull->DataOffset) ); break; case KeyValuePartialInformation: ppartial = (PKEY_VALUE_PARTIAL_INFORMATION)Buffer; printf("TitleIndex: %08lx\n", ppartial->TitleIndex); printf(" Type: %08lx\n", ppartial->Type); printf("DataLength: %08lx\n", ppartial->DataLength); printf(" Data: '%.*ws'\n", ppartial->DataLength/2, ((PUCHAR)&(ppartial->Data))); break; } NtClose(BaseHandle); exit(0); } void processargs( int argc, char *argv[] ) { ANSI_STRING temp; if ( (argc < 2) ) { printf("Usage: %s [infotype] [bufferlen]\n", argv[0]); exit(1); } RtlInitAnsiString( &temp, argv[1] ); RtlAnsiStringToUnicodeString( &WorkName, &temp, TRUE ); RtlInitAnsiString( &temp, argv[2] ); RtlAnsiStringToUnicodeString( &WorkName2, &temp, TRUE ); if (argc > 3) { InfoType = atoi(argv[3]); } if (argc > 4) { BufferSize = atoi(argv[4]); } return; }