/*
 * 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);
}

/******************************************************************************
 * 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);
}

/******************************************************************************
 * 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);
}

/******************************************************************************
 * 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 = (HANDLE)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);
}

/******************************************************************************
 * 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);
}

/******************************************************************************
 * 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);
}

/******************************************************************************
 * 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;
}