Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

356 lines
9.8 KiB

#include "pch.cxx"
#include <ole2.h>
#include <stdio.h>
#include <tchar.h>
#include <pstgserv.hxx>
CPropertyStorageServerApp cPropStgServerApp;
const TCHAR tszCLSIDInterface[] = "{af4ae0d0-a37f-11cf-8d73-00aa004cd01a}";
const TCHAR tszCLSIDApp[] = "{af4ae0d1-a37f-11cf-8d73-00aa004cd01a}";
void
SelfRegistration( HINSTANCE hinst )
{
LONG lRet;
DWORD dwDisposition;
HKEY hkeyBase = NULL;
HKEY hkey = NULL;
LPTSTR tszError = NULL;
LPTSTR tszServerName = TEXT("PropTest Local Server");
LPTSTR tszProxyStubName = TEXT("PropTest Local Server Proxy/Stub");
TCHAR tszModulePathAndName[ MAX_PATH + 1 ];
TCHAR tszKeyName[ MAX_PATH + 1 ];
LPTSTR tszNumMethods = TEXT("5");
// ----------------------------------------
// Update the CLSID key for the application
// ----------------------------------------
// Open HKEY_CLASSES_ROOT\CLSID\{af4ae0d1-...1a}
_tcscpy( tszKeyName, TEXT("CLSID\\") );
_tcscat( tszKeyName, tszCLSIDApp );
lRet = RegCreateKeyEx(HKEY_CLASSES_ROOT,
tszKeyName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkeyBase,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create primary CLSID key");
goto Exit;
}
// Write a name for this CLSID
lRet = RegSetValueEx( hkeyBase,
NULL,
0,
REG_SZ,
(const BYTE*) tszServerName,
_tcslen(tszServerName) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set local server name");
goto Exit;
}
// Get this program's path and name
if( !GetModuleFileName( hinst, tszModulePathAndName,
sizeof(tszModulePathAndName)/sizeof(TCHAR) ))
{
tszError = TEXT("Couldn't get Module file name");
goto Exit;
}
// Set the LocalServer32 value
lRet = RegCreateKeyEx(hkeyBase,
TEXT("LocalServer32"),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create LocalServer32 key");
goto Exit;
}
lRet = RegSetValueEx( hkey,
NULL,
0,
REG_SZ,
(const BYTE*) tszModulePathAndName,
(1 + _tcslen(tszModulePathAndName) ) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set local server name");
goto Exit;
}
CloseHandle( hkey );
hkey = NULL;
CloseHandle( hkeyBase );
hkeyBase = NULL;
// ---------------------------------------
// Update the CLSID key for the proxy/stub
// ---------------------------------------
// Set the InProcServer32 value (the proxy/stub)
// We assume that the proxy/stub has the same name as this
// local server (except with a dll extension), and we assume
// that it's in the same path. We really should have a
// DllRegisterServer function in the DLL itself that does this,
// but we do it here instead to save some code.
_tcscpy( &tszModulePathAndName[ _tcslen(tszModulePathAndName) - 3 ],
TEXT("dll") );
_tcscpy( tszKeyName, TEXT("CLSID\\") );
_tcscat( tszKeyName, tszCLSIDInterface );
lRet = RegCreateKeyEx(HKEY_CLASSES_ROOT,
tszKeyName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkeyBase,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create proxy/stub CLSID key");
goto Exit;
}
// Write a name for this CLSID
lRet = RegSetValueEx( hkeyBase,
NULL,
0,
REG_SZ,
(const BYTE*) tszProxyStubName,
_tcslen(tszProxyStubName) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set proxy/stub name");
goto Exit;
}
// Set the InproxServer32 value
lRet = RegCreateKeyEx(hkeyBase,
TEXT("InprocServer32"),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create InprocServer32 key");
goto Exit;
}
lRet = RegSetValueEx( hkey,
NULL,
0,
REG_SZ,
(const BYTE*) tszModulePathAndName,
(1 + _tcslen(tszModulePathAndName) ) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set proxy/stub value");
goto Exit;
}
CloseHandle( hkey );
hkey = NULL;
CloseHandle( hkeyBase );
hkeyBase = NULL;
// ------------------------
// Update the Interface key
// ------------------------
// Open HKEY_CLASSES_ROOT\Interface\{af4ae0d0-...1a}
_tcscpy( tszKeyName, TEXT("Interface\\") );
_tcscat( tszKeyName, tszCLSIDInterface );
lRet = RegCreateKeyEx(HKEY_CLASSES_ROOT,
tszKeyName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkeyBase,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create interface key");
goto Exit;
}
// Write a name for this IID
lRet = RegSetValueEx( hkeyBase,
NULL,
0,
REG_SZ,
(const BYTE*) tszServerName,
_tcslen(tszServerName) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set local server name");
goto Exit;
}
// Set the NumMethods value
lRet = RegCreateKeyEx(hkeyBase,
TEXT("NumMethods"),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create NumMethods key");
goto Exit;
}
lRet = RegSetValueEx( hkey,
NULL,
0,
REG_SZ,
(const BYTE*) tszNumMethods,
(1 + _tcslen(tszNumMethods) ) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set number of methods");
goto Exit;
}
CloseHandle( hkey );
hkey = NULL;
// Set the Proxy/Stub CLSID
lRet = RegCreateKeyEx(hkeyBase,
TEXT("ProxyStubClsid32"),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't create ProxyStubClsid32 key");
goto Exit;
}
lRet = RegSetValueEx( hkey,
NULL,
0,
REG_SZ,
(const BYTE*) tszCLSIDInterface,
(1 + _tcslen(tszCLSIDInterface) ) * sizeof(TCHAR) );
if( ERROR_SUCCESS != lRet )
{
tszError = TEXT("Couldn't set ProxyStubClsid32");
goto Exit;
}
CloseHandle( hkey );
hkey = NULL;
CloseHandle( hkeyBase );
hkeyBase = NULL;
// ----
// Exit
// ----
Exit:
if( ERROR_SUCCESS != lRet )
{
TCHAR tszErrorMessage[ 256 ];
_tcscpy( tszErrorMessage, tszError );
_stprintf( &tszErrorMessage[ _tcslen(tszErrorMessage) ],
TEXT("\nError = %lu"),
GetLastError() );
MessageBox( NULL, tszErrorMessage, TEXT("PStgServ (PropTest) Self-Registration Error"), MB_OK );
if( hkey ) CloseHandle( hkey );
if( hkeyBase ) CloseHandle( hkeyBase );
}
return;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow )
{
if( !strcmp( lpszCmdLine, "/RegServer" )
||
!strcmp( lpszCmdLine, "-RegServer" ))
{
SelfRegistration( hInstance );
}
else if( cPropStgServerApp.Init(hInstance, hPrevInstance,
lpszCmdLine, nCmdShow) )
{
return( cPropStgServerApp.Run() );
}
return( 0 );
}