332 lines
5.2 KiB
C
332 lines
5.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
regtest.c
|
|
|
|
Abstract:
|
|
|
|
Test for quick and dirty registry test (very basic)
|
|
|
|
Author:
|
|
|
|
Bryan M. Willman (bryanwi) 30-Apr-1991
|
|
|
|
Environment:
|
|
|
|
User mode.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdio.h"
|
|
#include "nt.h"
|
|
|
|
int strlen(PUCHAR);
|
|
void main();
|
|
|
|
VOID DoTest(HANDLE RootKey);
|
|
|
|
#define MAX_VALUE 256
|
|
UCHAR ValueBuffer[MAX_VALUE];
|
|
|
|
VOID
|
|
main()
|
|
{
|
|
DbgPrint("Machine\n");
|
|
DoTest((HANDLE)REG_LOCAL_MACHINE);
|
|
DbgPrint("User\n");
|
|
DoTest((HANDLE)REG_LOCAL_USER);
|
|
}
|
|
VOID
|
|
DoTest(
|
|
HANDLE RootKey
|
|
)
|
|
{
|
|
NTSTATUS rc;
|
|
STRING String1;
|
|
UCHAR Value1[] = "This string is value 1.";
|
|
UCHAR Value2[] = "Value 2 is represented by this string.";
|
|
HANDLE Handle1;
|
|
HANDLE Handle2;
|
|
ULONG ValueLength;
|
|
ULONG Type;
|
|
LARGE_INTEGER Time;
|
|
|
|
//
|
|
// Create parent node
|
|
//
|
|
|
|
DbgPrint("Part1\n");
|
|
RtlInitString(&String1, "Test1");
|
|
rc = NtCreateKey(
|
|
RootKey,
|
|
&String1,
|
|
0,
|
|
NULL,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
&Handle1
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("1:CreateKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Set data into parent
|
|
//
|
|
|
|
DbgPrint("Part2\n");
|
|
rc = NtSetValueKey(
|
|
Handle1,
|
|
1, // type
|
|
Value1,
|
|
strlen(Value1)
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("2:SetValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Query and compare data from parent
|
|
//
|
|
|
|
DbgPrint("Part2b\n");
|
|
ValueLength = MAX_VALUE;
|
|
rc = NtQueryValueKey(
|
|
Handle1,
|
|
&Type,
|
|
ValueBuffer,
|
|
&ValueLength,
|
|
&Time
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("2b:QueryValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
if (ValueLength != (ULONG)strlen(Value1)) {
|
|
DbgPrint("2b1:Wrong value length\n");
|
|
return;
|
|
} else if (RtlCompareMemory(
|
|
ValueBuffer, Value1, ValueLength) != ValueLength) {
|
|
DbgPrint("2b2:Wrong value\n");
|
|
return;
|
|
} else if (Type != 1) {
|
|
DbgPrint("2b3:Wrong type\n");
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Close parent
|
|
//
|
|
|
|
DbgPrint("Part3\n");
|
|
NtCloseKey(Handle1);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("3:CloseKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Reopen parent
|
|
//
|
|
|
|
DbgPrint("Part4\n");
|
|
rc = NtOpenKey(
|
|
RootKey,
|
|
&String1,
|
|
0,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
&Handle1
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("4:OpenKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Create child
|
|
//
|
|
|
|
DbgPrint("Part5\n");
|
|
RtlInitString(&String1, "Test2");
|
|
rc = NtCreateKey(
|
|
Handle1,
|
|
&String1,
|
|
0,
|
|
NULL,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
&Handle2
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("5:CreateKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Set data into child
|
|
//
|
|
|
|
DbgPrint("Part6\n");
|
|
rc = NtSetValueKey(
|
|
Handle2,
|
|
2, // type
|
|
Value2,
|
|
strlen(Value2)
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("6:SetValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Query and compare data from child
|
|
//
|
|
|
|
DbgPrint("Part7\n");
|
|
ValueLength = MAX_VALUE;
|
|
rc = NtQueryValueKey(
|
|
Handle2,
|
|
&Type,
|
|
ValueBuffer,
|
|
&ValueLength,
|
|
&Time
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("7:QueryValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
if (ValueLength != (ULONG)strlen(Value2)) {
|
|
DbgPrint("7.1:Wrong value length\n");
|
|
return;
|
|
} else if (RtlCompareMemory(
|
|
ValueBuffer, Value2, ValueLength) != ValueLength) {
|
|
DbgPrint("7.2:Wrong value\n");
|
|
return;
|
|
} else if (Type != 2) {
|
|
DbgPrint("7.3:Wrong type\n");
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Query and compare data from parent again
|
|
//
|
|
|
|
DbgPrint("Part8\n");
|
|
ValueLength = MAX_VALUE;
|
|
rc = NtQueryValueKey(
|
|
Handle1,
|
|
&Type,
|
|
ValueBuffer,
|
|
&ValueLength,
|
|
&Time
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("8:QueryValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
if (ValueLength != (ULONG)strlen(Value1)) {
|
|
DbgPrint("8.1:Wrong value length\n");
|
|
return;
|
|
} else if (RtlCompareMemory(
|
|
ValueBuffer, Value1, ValueLength) != ValueLength) {
|
|
DbgPrint("8.2:Wrong value\n");
|
|
return;
|
|
} else if (Type != 1) {
|
|
DbgPrint("8.3:Wrong type\n");
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Reset parent data
|
|
//
|
|
|
|
DbgPrint("Part9\n");
|
|
rc = NtSetValueKey(
|
|
Handle1,
|
|
1, // type
|
|
Value2,
|
|
strlen(Value2)
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("9:SetValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// Query and compare reset data
|
|
//
|
|
|
|
DbgPrint("Part10\n");
|
|
ValueLength = MAX_VALUE;
|
|
rc = NtQueryValueKey(
|
|
Handle1,
|
|
&Type,
|
|
ValueBuffer,
|
|
&ValueLength,
|
|
&Time
|
|
);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("10:QueryValueKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
if (ValueLength != (ULONG)strlen(Value2)) {
|
|
DbgPrint("10.1:Wrong value length\n");
|
|
return;
|
|
} else if (RtlCompareMemory(
|
|
ValueBuffer, Value2, ValueLength) != ValueLength) {
|
|
DbgPrint("10.2:Wrong value\n");
|
|
return;
|
|
} else if (Type != 1) {
|
|
DbgPrint("10.3:Wrong type\n");
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Close off handles and return
|
|
//
|
|
|
|
DbgPrint("Part11\n");
|
|
rc = NtCloseKey(Handle1);
|
|
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("11:CloseKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
DbgPrint("Part12\n");
|
|
rc = NtCloseKey(Handle2);
|
|
if (!NT_SUCCESS(rc)) {
|
|
DbgPrint("12:CloseKey failed rc = %08lx", rc);
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|