windows-nt/Source/XPSP1/NT/base/wow64/regremap/regsetup/main.c
2020-09-26 16:20:57 +08:00

315 lines
5.9 KiB
C

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
main.c
Abstract:
This module will do the necessary things to setup initial registry for the redirection
purpose.
//
// Test case scenario
// 1. Open a ISN node and list content
// 2. Create a ISN node do 1.
// 3. Open a non ISN node and list
// 4. Create a non ISN node and list content
//
Outstanding issue:
reflector: If Key has been created on one side, we can reflect that on the other side.
Deletion: Without any additional attribute it's impossible to track.
Author:
ATM Shafiqul Khalid (askhalid) 18-Nov-1999
Revision History:
--*/
#include <windows.h>
#include <windef.h>
#include <stdio.h>
#include "wow64reg.h"
#include <assert.h>
#include "..\wow64reg\reflectr.h"
#include <shlwapi.h>
VOID
CleanupWow64NodeKey ()
/*++
Routine Description
Remove the entry for wow64.
Arguments:
None.
Return Value:
None.
--*/
{
DWORD Ret;
HKEY Key;
Ret = RegOpenKey ( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft", &Key);
if ( Ret == ERROR_SUCCESS ) {
Ret = SHDeleteKey ( Key, L"WOW64");
if ( Ret != ERROR_SUCCESS )
Wow64RegDbgPrint ( ("\n sorry! couldn't delete the key...SOFTWARE\\Microsoft\\WOW64"));
RegCloseKey (Key);
} else
Wow64RegDbgPrint ( ("\nSOFTWARE\\Microsoft\\WOW64 node is missing setup will creat that.") );
}
LPTSTR NextParam (
LPTSTR lpStr
)
/*++
Routine Description
Point to the next parameter in the commandline.
Arguments:
lpStr - pointer to the current command line
Return Value:
TRUE if the function succeed, FALSE otherwise.
--*/
{
WCHAR ch = L' ';
if (lpStr == NULL )
return NULL;
if ( *lpStr == 0 )
return lpStr;
while ( ( *lpStr != 0 ) && ( lpStr[0] != ch )) {
if ( ( lpStr [0] == L'\"') || ( lpStr [0] == L'\'') )
ch = lpStr [0];
lpStr++;
}
if ( ch !=L' ' ) lpStr++;
while ( ( *lpStr != 0 ) && (lpStr[0] == L' ') )
lpStr++;
return lpStr;
}
DWORD CopyParam (
LPTSTR lpDestParam,
LPTSTR lpCommandParam
)
/*++
Routine Description
Copy the current parameter to lpDestParam.
Arguments:
lpDestParam - that receive current parameter
lpCommandParam - pointer to the current command line
Return Value:
TRUE if the function succeed, FALSE otherwise.
--*/
{
DWORD dwLen = 0;
WCHAR ch = L' ';
*lpDestParam = 0;
if ( ( lpCommandParam [0] == L'\"') || ( lpCommandParam [0] == L'\'') ) {
ch = lpCommandParam [0];
lpCommandParam++;
};
while ( ( lpCommandParam [0] ) != ch && ( lpCommandParam [0] !=0 ) ) {
*lpDestParam++ = *lpCommandParam++;
dwLen++;
if ( dwLen>255 ) return FALSE;
}
if ( ch != L' ' && ch != lpCommandParam [0] )
return FALSE;
else lpCommandParam++;
*lpDestParam = 0;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
BOOL
ParseCommand ()
/*++
Routine Description
Parse command line parameters. Get different options from
command line parameters.
Arguments:
None.
Return Value:
TRUE if the function succeed, FALSE otherwise.
--*/
{
LPTSTR lptCmdLine1 = GetCommandLine ();
LPTSTR lptCmdLine = NextParam ( lptCmdLine1 );
if ( lptCmdLine== NULL || lptCmdLine[0] == 0 )
return FALSE;
printf ("\nRunning Wow64 registry setup program.....\n");
while ( ( lptCmdLine != NULL ) && ( lptCmdLine[0] != 0 ) ) {
if ( lptCmdLine[0] != '-' )
return FALSE;
switch ( lptCmdLine[1] ) {
case L'c':
printf ("\nCopying from 32bit to 64bit isn't implemented yet");
break;
case L'C': // CopyRegistryKey
SetInitialCopy ();
PopulateReflectorTable ();
CreateIsnNode();
break;
case L'd':
printf ("\nRemove all the Keys from 32bit side that were copied from 64bit side");
CleanpRegistry ( );
break;
case L'D':
printf ("\nRemove all the Keys from 32bit side that were copied from 64bit side");
CleanpRegistry ();
break;
case L'p':
case L'P': // populate registry
CleanupWow64NodeKey ();
PopulateReflectorTable ();
break;
case 't':
{
InitializeIsnTableReflector ();
CreateIsnNodeSingle( 4 );
CreateIsnNodeSingle( 5 );
}
break;
case L'r':
case L'R':
//
// run the reflector codes;
//
InitReflector ();
if ( !RegisterReflector () ) {
printf ("\nSorry! reflector couldn't be register");
UnRegisterReflector ();
return FALSE;
}
printf ("\nSleeping for 100 min to test reflector codes ...........\n");
Sleep (1000*60*100);
UnRegisterReflector ();
break;
default:
return FALSE;
break;
}
lptCmdLine = NextParam ( lptCmdLine );
}
return TRUE;
}
int __cdecl
main()
{
if (!ParseCommand ()) {
printf ( "\nUsages: w64setup [-c] [-C] [-d] [-D] [-r]\n");
printf ( "\n -c Copy from 32bit to 64bit side of the registry");
printf ( "\n -C Copy from 64bit to 32bit side of the registry");
printf ( "\n");
printf ( "\n -d Remove all the Keys from 32bit side that were copied from 64bit side");
printf ( "\n -D Remove all the Keys from 64bit side that were copied from 32bit side");
printf ( "\n");
printf ( "\n -r Run reflector thread");
printf ("\n");
return 0;
}
printf ("\nDone.");
return 0;
}