|  | /* | 
|  | * Registry testing program | 
|  | * | 
|  | * Copyright 1998 Matthew Becker | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | * | 
|  | * The return codes were generated in an NT40 environment, using lcc-win32 | 
|  | * | 
|  | * NOTES | 
|  | *    When compiling under lcc-win32, I get three (3) warning, but they all | 
|  | *    seem to be issues with lcc. | 
|  | * | 
|  | *    If creating a new testing sequence, please try to clean up any | 
|  | *    registry changes that are made. | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <windows.h> | 
|  | #include <winreg.h> | 
|  | #include <winerror.h> | 
|  | #include <winnt.h> | 
|  |  | 
|  | #ifndef __GNUC__ | 
|  | #define __FUNCTION__ "<function>" | 
|  | #endif | 
|  |  | 
|  | /* True this when security is implemented */ | 
|  | #define CHECK_SAM FALSE | 
|  |  | 
|  | #define xERROR(s,d) fprintf(stderr, "%s:#%d(Status=%ld)\n", __FUNCTION__,s,d) | 
|  |  | 
|  | /* | 
|  | * NOTES: These individual routines are listed in alphabetical order. | 
|  | * | 
|  | * They are meant to test error conditions.  Success conditions are | 
|  | * tested in the sequences found at the end. | 
|  | */ | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestCloseKey | 
|  | */ | 
|  | void TestCloseKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegCloseKey((HKEY)2); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegCloseKey(HKEY_LOCAL_MACHINE); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  |  | 
|  | /* Check twice just for kicks */ | 
|  | lSts = RegCloseKey(HKEY_LOCAL_MACHINE); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(3,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestConnectRegistry | 
|  | */ | 
|  | void TestConnectRegistry() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey; | 
|  |  | 
|  | lSts = RegConnectRegistry("",(HKEY)2,&hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegConnectRegistry("",HKEY_LOCAL_MACHINE,&hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  |  | 
|  | #if TOO_SLOW | 
|  | lSts = RegConnectRegistry("\\\\regtest",HKEY_LOCAL_MACHINE,&hkey); | 
|  | if (lSts != ERROR_BAD_NETPATH) xERROR(3,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestCreateKey | 
|  | */ | 
|  | void TestCreateKey() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey; | 
|  |  | 
|  | lSts = RegCreateKey((HKEY)2,"",&hkey); | 
|  | if (lSts != ERROR_BADKEY) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"",&hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  | RegCloseKey(hkey); | 
|  |  | 
|  | lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf",&hkey); | 
|  | if (lSts != ERROR_BAD_PATHNAME) xERROR(3,lSts); | 
|  |  | 
|  | #if 0 | 
|  | lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"asdf\\",&hkey); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts); | 
|  | #endif | 
|  |  | 
|  | lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf\\",&hkey); | 
|  | if (lSts != ERROR_BAD_PATHNAME) xERROR(5,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestCreateKeyEx | 
|  | */ | 
|  | void TestCreateKeyEx() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey; | 
|  | DWORD dwDisp; | 
|  |  | 
|  | lSts = RegCreateKeyEx((HKEY)2,"",0,"",0,0,NULL,&hkey,&dwDisp); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0,0,NULL,&hkey, | 
|  | &dwDisp); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"asdf",0, | 
|  | KEY_ALL_ACCESS,NULL,&hkey,&dwDisp); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0, | 
|  | KEY_ALL_ACCESS,NULL,&hkey,&dwDisp); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts); | 
|  |  | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestCreateKeyEx | 
|  | */ | 
|  | void TestCreateKeyEx1() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey,hkeyP; | 
|  | DWORD dwDisp; | 
|  | char keyname[]="regtest1"; | 
|  |  | 
|  | lSts = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE",0,1,&hkeyP); | 
|  | if (lSts != ERROR_SUCCESS) | 
|  | { | 
|  | xERROR(1,lSts); | 
|  | return; | 
|  | } | 
|  | lSts = RegCreateKeyEx(hkeyP,keyname,0,0,0,0xf003f,0,&hkey,&dwDisp); | 
|  | if (lSts != ERROR_SUCCESS) | 
|  | { | 
|  | xERROR(2,lSts); | 
|  | RegCloseKey(hkeyP); | 
|  | return; | 
|  | } | 
|  | lSts = RegDeleteKey( hkeyP,keyname); | 
|  | if (lSts != ERROR_SUCCESS)  xERROR(3,lSts); | 
|  | RegCloseKey(hkeyP); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestDeleteKey | 
|  | */ | 
|  | void TestDeleteKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegDeleteKey((HKEY)2, "asdf"); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegDeleteKey(HKEY_CURRENT_USER, "asdf"); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(2,lSts); | 
|  |  | 
|  | #if CHECK_SAM | 
|  | lSts = RegDeleteKey(HKEY_CURRENT_USER, ""); | 
|  | if (lSts != ERROR_ACCESS_DENIED) xERROR(3,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestDeleteValue | 
|  | */ | 
|  | void TestDeleteValue() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegDeleteValue((HKEY)2, "asdf"); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegDeleteValue(HKEY_CURRENT_USER, ""); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegDeleteValue(HKEY_CURRENT_USER, "asdf"); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegDeleteValue(HKEY_CURRENT_USER, "\\asdf"); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(4,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestEnumKey | 
|  | */ | 
|  | void TestEnumKey() | 
|  | { | 
|  | long lSts; | 
|  | char *sVal; | 
|  | long lVal; | 
|  |  | 
|  | lVal = 1; | 
|  | sVal = (char *)malloc(lVal * sizeof(char)); | 
|  |  | 
|  | lSts = RegEnumKey((HKEY)2,3,sVal,lVal); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegEnumKey(HKEY_CURRENT_USER,-1,sVal,lVal); | 
|  | if (lSts != ERROR_NO_MORE_ITEMS) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegEnumKey(HKEY_CURRENT_USER,0,sVal,lVal); | 
|  | if (lSts != ERROR_MORE_DATA) xERROR(3,lSts); | 
|  |  | 
|  | free(sVal); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestEnumKeyEx | 
|  | */ | 
|  | void TestEnumKeyEx() | 
|  | { | 
|  | long lSts; | 
|  | char *sVal; | 
|  | char *sClass; | 
|  | unsigned long lLen1; | 
|  | unsigned long lLen2; | 
|  | FILETIME ft; | 
|  |  | 
|  | lLen1 = 1; | 
|  | sVal = (char *)malloc(lLen1 * sizeof(char)); | 
|  | lLen2 = 1; | 
|  | sClass = (char *)malloc(lLen2 * sizeof(char)); | 
|  |  | 
|  | lSts = RegEnumKeyEx((HKEY)2,0,sVal,&lLen1,0,sClass,&lLen2,&ft); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft); | 
|  | if (lSts != ERROR_MORE_DATA) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft); | 
|  | if (lSts != ERROR_MORE_DATA) xERROR(3,lSts); | 
|  |  | 
|  | free(sVal); | 
|  | free(sClass); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestEnumValue | 
|  | */ | 
|  | void TestEnumValue() | 
|  | { | 
|  | long lSts; | 
|  | char *sVal; | 
|  | unsigned long lVal; | 
|  | unsigned long lType; | 
|  | unsigned long lLen1; | 
|  | char *bVal; | 
|  |  | 
|  | lVal = 1; | 
|  | sVal = (char *)malloc(lVal * sizeof(char)); | 
|  | lLen1 = 1; | 
|  | bVal = (char *)malloc(lLen1 * sizeof(char)); | 
|  |  | 
|  | lSts = RegEnumValue((HKEY)2,-1,sVal,&lVal,0,&lType,NULL,&lLen1); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegEnumValue(HKEY_LOCAL_MACHINE,-1,sVal,&lVal,0,&lType,NULL,&lLen1); | 
|  | if (lSts != ERROR_NO_MORE_ITEMS) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,&lType,NULL,&lLen1); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,NULL,NULL,&lLen1); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(4,lSts); | 
|  |  | 
|  | lSts = RegEnumValue(HKEY_LOCAL_MACHINE,1,sVal,&lVal,0,&lType,bVal,&lLen1); | 
|  | if (lSts != ERROR_NO_MORE_ITEMS) xERROR(5,lSts); | 
|  |  | 
|  | free(sVal); | 
|  | free(bVal); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestFlushKey | 
|  | */ | 
|  | void TestFlushKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegFlushKey((HKEY)2); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegFlushKey(HKEY_LOCAL_MACHINE); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestGetKeySecurity | 
|  | */ | 
|  | void TestGetKeySecurity() | 
|  | { | 
|  | long lSts; | 
|  | SECURITY_INFORMATION si; | 
|  | SECURITY_DESCRIPTOR sd; | 
|  | unsigned long lLen; | 
|  |  | 
|  | lLen = sizeof(sd); | 
|  | si = 0; | 
|  | lSts = RegGetKeySecurity((HKEY)2,si,&sd,&lLen); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen); | 
|  | if (lSts != ERROR_INSUFFICIENT_BUFFER) xERROR(2,lSts); | 
|  |  | 
|  | si = GROUP_SECURITY_INFORMATION; | 
|  | lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(3,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestLoadKey | 
|  | */ | 
|  | void TestLoadKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegLoadKey((HKEY)2,"",""); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegLoadKey(HKEY_CURRENT_USER,"",""); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest",""); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest",""); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts); | 
|  |  | 
|  | #if CHECK_SAM | 
|  | lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest","regtest.dat"); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(5,lSts); | 
|  |  | 
|  | lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest","regtest.dat"); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(6,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestNotifyChangeKeyValue | 
|  | */ | 
|  | void TestNotifyChangeKeyValue() | 
|  | { | 
|  | long lSts; | 
|  | HANDLE hEvent; | 
|  |  | 
|  | hEvent = 0; | 
|  |  | 
|  | lSts = RegNotifyChangeKeyValue((HKEY)2, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 0); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 1); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | hEvent = (HANDLE)HKEY_CURRENT_USER; | 
|  | lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, hEvent, 1); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(3,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestOpenKey | 
|  | */ | 
|  | void TestOpenKey() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey; | 
|  |  | 
|  | lSts = RegOpenKey((HKEY)72, "",&hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(1,lSts); | 
|  | RegCloseKey(hkey); | 
|  |  | 
|  | lSts = RegOpenKey((HKEY)2, "regtest",&hkey); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegOpenKey(HKEY_CURRENT_USER, "regtest",&hkey); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegOpenKey(HKEY_CURRENT_USER, "\\regtest",&hkey); | 
|  | if (lSts != ERROR_BAD_PATHNAME) xERROR(4,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestOpenKeyEx | 
|  | */ | 
|  | void TestOpenKeyEx() | 
|  | { | 
|  | long lSts; | 
|  | HKEY hkey; | 
|  |  | 
|  | lSts = RegOpenKeyEx((HKEY)2,"",0,KEY_ALL_ACCESS,&hkey); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"\\regtest",0,KEY_ALL_ACCESS,&hkey); | 
|  | if (lSts != ERROR_BAD_PATHNAME) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest",0,0,&hkey); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest\\",0,0,&hkey); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(4,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestQueryInfoKey | 
|  | */ | 
|  | void TestQueryInfoKey() | 
|  | { | 
|  | long lSts; | 
|  | char *sClass; | 
|  | unsigned long lClass; | 
|  | unsigned long lSubKeys; | 
|  | unsigned long lMaxSubLen; | 
|  | unsigned long lMaxClassLen; | 
|  | unsigned long lValues; | 
|  | unsigned long lMaxValNameLen; | 
|  | unsigned long lMaxValLen; | 
|  | unsigned long lSecDescLen; | 
|  | FILETIME ft; | 
|  |  | 
|  | lClass = 1; | 
|  | sClass = (char *)malloc(lClass * sizeof(char)); | 
|  |  | 
|  | lSts = RegQueryInfoKey((HKEY)2,sClass,&lClass,0,&lSubKeys,&lMaxSubLen, | 
|  | &lMaxClassLen,&lValues,&lMaxValNameLen,&lMaxValLen, | 
|  | &lSecDescLen, &ft); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegQueryInfoKey(HKEY_CURRENT_USER,sClass,&lClass,0,&lSubKeys, | 
|  | &lMaxSubLen,&lMaxClassLen,&lValues,&lMaxValNameLen, | 
|  | &lMaxValLen,&lSecDescLen, &ft); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  |  | 
|  | free(sClass); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestQueryValue | 
|  | */ | 
|  | void TestQueryValue() | 
|  | { | 
|  | long lSts; | 
|  | long lLen; | 
|  | char *sVal; | 
|  |  | 
|  | sVal = (char *)malloc(80 * sizeof(char)); | 
|  | lLen = strlen(sVal); | 
|  |  | 
|  | lSts = RegQueryValue((HKEY)2,"",NULL,&lLen); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegQueryValue(HKEY_CURRENT_USER,"",NULL,&lLen); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegQueryValue(HKEY_CURRENT_USER,"\\regtest",NULL,&lLen); | 
|  | if (lSts != ERROR_BAD_PATHNAME) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegQueryValue(HKEY_CURRENT_USER,"",sVal,&lLen); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(4,lSts); | 
|  |  | 
|  | free(sVal); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestQueryValueEx | 
|  | */ | 
|  | void TestQueryValueEx() | 
|  | { | 
|  | char *sVal; | 
|  | long lSts; | 
|  | unsigned long lType; | 
|  | unsigned long lLen; | 
|  |  | 
|  | lLen = 80; | 
|  | sVal = (char *)malloc(lLen * sizeof(char)); | 
|  |  | 
|  | lSts = RegQueryValueEx((HKEY)2,"",0,&lType,sVal,&lLen); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegQueryValueEx(HKEY_CURRENT_USER,"",(LPDWORD)1,&lType,sVal,&lLen); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegQueryValueEx(HKEY_LOCAL_MACHINE,"",0,&lType,sVal,&lLen); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(3,lSts); | 
|  |  | 
|  | free(sVal); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestReplaceKey | 
|  | */ | 
|  | void TestReplaceKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegReplaceKey((HKEY)2,"","",""); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | #if CHECK_SAM | 
|  | lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"","",""); | 
|  | if (lSts != ERROR_ACCESS_DENIED) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"Software","",""); | 
|  | if (lSts != ERROR_ACCESS_DENIED) xERROR(3,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestRestoreKey | 
|  | */ | 
|  | void TestRestoreKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegRestoreKey((HKEY)2,"",0); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"",0); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"a.a",0); | 
|  | if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestSaveKey | 
|  | */ | 
|  | void TestSaveKey() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegSaveKey((HKEY)2,"",NULL); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"",NULL); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | #if CHECK_SAM | 
|  | lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"a.a",NULL); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(3,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestSetKeySecurity | 
|  | */ | 
|  | void TestSetKeySecurity() | 
|  | { | 
|  | long lSts; | 
|  | SECURITY_DESCRIPTOR sd; | 
|  |  | 
|  | lSts = RegSetKeySecurity((HKEY)2,0,NULL); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,0,NULL); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,NULL); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts); | 
|  |  | 
|  | lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,&sd); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestSetValue | 
|  | */ | 
|  | void TestSetValue() | 
|  | { | 
|  | #if MAKE_NT_CRASH | 
|  | long lSts; | 
|  | #endif | 
|  |  | 
|  | #if MAKE_NT_CRASH | 
|  | lSts = RegSetValue((HKEY)2,"",0,NULL,0); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts); | 
|  | #endif | 
|  |  | 
|  | #if MAKE_NT_CRASH | 
|  | lSts = RegSetValue((HKEY)2,"regtest",0,NULL,0); | 
|  | if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts); | 
|  | #endif | 
|  |  | 
|  | #if MAKE_NT_CRASH | 
|  | lSts = RegSetValue((HKEY)2,"regtest",REG_SZ,NULL,0); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(3,lSts); | 
|  | #endif | 
|  |  | 
|  | #if MAKE_NT_CRASH | 
|  | lSts = RegSetValue(HKEY_LOCAL_MACHINE,"regtest",REG_SZ,NULL,0); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(4,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestSetValueEx | 
|  | */ | 
|  | void TestSetValueEx() | 
|  | { | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegSetValueEx((HKEY)2,"",0,0,NULL,0); | 
|  | if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegSetValueEx(HKEY_LOCAL_MACHINE,"",0,0,NULL,0); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestUnLoadKey | 
|  | */ | 
|  | void TestUnLoadKey() | 
|  | { | 
|  | #if CHECK_SAM | 
|  | long lSts; | 
|  | #endif | 
|  |  | 
|  | #if CHECK_SAM | 
|  | lSts = RegUnLoadKey((HKEY)2,""); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(1,lSts); | 
|  |  | 
|  | lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,""); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(2,lSts); | 
|  |  | 
|  | lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,"\\regtest"); | 
|  | if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(3,lSts); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /****************************************************************************** | 
|  | * TestSequence1 | 
|  | */ | 
|  | void TestSequence1() | 
|  | { | 
|  | HKEY hkey; | 
|  | long lSts; | 
|  |  | 
|  | lSts = RegCreateKey(HKEY_CURRENT_USER,"regtest",&hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(1,lSts); | 
|  |  | 
|  | /*    fprintf(stderr, " hkey=0x%x\n", hkey); */ | 
|  |  | 
|  | lSts = RegDeleteKey(HKEY_CURRENT_USER, "regtest"); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(2,lSts); | 
|  | lSts = RegCloseKey(hkey); | 
|  | if (lSts != ERROR_SUCCESS) xERROR(3,lSts); | 
|  | } | 
|  |  | 
|  |  | 
|  | int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) | 
|  | { | 
|  |  | 
|  | /* These can be in any order */ | 
|  | TestCloseKey(); | 
|  | TestConnectRegistry(); | 
|  | TestCreateKey(); | 
|  | TestCreateKeyEx(); | 
|  | TestDeleteKey(); | 
|  | TestDeleteValue(); | 
|  | TestEnumKey(); | 
|  | TestEnumKeyEx(); | 
|  | TestEnumValue(); | 
|  | TestFlushKey(); | 
|  | TestGetKeySecurity(); | 
|  | TestLoadKey(); | 
|  | TestNotifyChangeKeyValue(); | 
|  | TestOpenKey(); | 
|  | TestOpenKeyEx(); | 
|  | TestQueryInfoKey(); | 
|  | TestQueryValue(); | 
|  | TestQueryValueEx(); | 
|  | TestReplaceKey(); | 
|  | TestRestoreKey(); | 
|  | TestSaveKey(); | 
|  | TestSetKeySecurity(); | 
|  | TestSetValue(); | 
|  | TestSetValueEx(); | 
|  | TestUnLoadKey(); | 
|  | TestCreateKeyEx1(); | 
|  |  | 
|  | /* Now we have some sequence testing */ | 
|  | TestSequence1(); | 
|  |  | 
|  | return 0; | 
|  | } |