|
|
/*++
Copyright (c) 1991-92 Microsoft Corporation
Module Name:
tacc.c
Abstract:
Test for accounts.
Author:
Rita Wong (ritaw) 02-May-1992
Environment:
User Mode - Win32
Revision History:
--*/
#include <stdio.h>
#include <stdlib.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <nwsnames.h>
DWORD TestOpenSCManager( OUT LPSC_HANDLE hScManager, IN LPWSTR DatabaseName, IN DWORD DesiredAccess, IN DWORD ExpectedError );
DWORD TestCreateService( IN SC_HANDLE hScManager, IN LPWSTR ServiceName, IN DWORD ServiceType, IN LPWSTR BinaryPath, IN LPWSTR Dependencies );
void __cdecl main( void ) { DWORD status; SC_HANDLE hScManager; SC_HANDLE hService; LONG RegError; HKEY ServiceKey; HKEY LinkageKey; DWORD Disposition; DWORD Type = 0x00000007;
PWCHAR Dependencies = L"MSIPX\0Streams\0Mup\0";
//
// Valid desired access
//
if (TestOpenSCManager( &hScManager, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE, NO_ERROR ) == NO_ERROR) {
//
// Install NwRdr file system driver
//
status = TestCreateService( hScManager, L"NwRdr", SERVICE_FILE_SYSTEM_DRIVER, L"\\SystemRoot\\System32\\Drivers\\nwrdr.sys", NULL );
if (status != NO_ERROR) { (void) CloseServiceHandle(hScManager); return; }
//
// Install NWCWorkstation service own process
//
status = TestCreateService( hScManager, NW_SERVICE_WORKSTATION, SERVICE_WIN32_SHARE_PROCESS, L"%SystemRoot%\\System32\\nwsvc.exe", Dependencies );
(void) CloseServiceHandle(hScManager);
if (status != NO_ERROR) { return; }
//
// Write the linkage key under the NWCWorkstation key
//
RegError = RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Services\\NWCWorkstation", REG_OPTION_NON_VOLATILE, KEY_READ | KEY_CREATE_SUB_KEY, &ServiceKey );
if (RegError != ERROR_SUCCESS) { printf("RegOpenKeyExW failed %ld\n", RegError); return; }
RegError = RegCreateKeyExW( ServiceKey, L"Linkage", 0, WIN31_CLASS, REG_OPTION_NON_VOLATILE, // options
KEY_WRITE, NULL, &LinkageKey, &Disposition );
RegCloseKey(ServiceKey);
if (RegError != ERROR_SUCCESS) { printf("RegCreateKeyExW failed %ld\n", RegError); return; }
RegError = RegSetValueExW( LinkageKey, L"Bind", 0, REG_MULTI_SZ, L"\\Device\\Streams\\IPX\0", (wcslen(L"\\Device\\Streams\\IPX\0") + 1) * sizeof(WCHAR) );
RegCloseKey(LinkageKey);
if (RegError != ERROR_SUCCESS) { printf("RegSetValueEx failed %ld\n", RegError); return; }
//
// Add a system event entry for the NetWare workstation
//
RegError = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Services\\Eventlog\\System\\NWCWorkstation", 0, WIN31_CLASS, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &ServiceKey, &Disposition );
if (RegError != ERROR_SUCCESS) { printf("RegCreateKeyExW of eventlog entry failed %ld\n", RegError); return; }
RegError = RegSetValueExW( ServiceKey, L"EventMessageFile", 0, REG_EXPAND_SZ, L"%SystemRoot%\\System32\\nwevent.dll", wcslen(L"%SystemRoot%\\System32\\nwevent.dll") * sizeof(WCHAR) );
if (RegError != ERROR_SUCCESS) { printf("RegSetValueExW of EventMessageFile value failed %ld\n", RegError); RegCloseKey(ServiceKey); return; }
RegError = RegSetValueExW( ServiceKey, L"TypesSupported", 0, REG_DWORD, &Type, sizeof(DWORD) );
RegCloseKey(ServiceKey);
if (RegError != ERROR_SUCCESS) { printf("RegSetValueExW of TypesSupported value failed %ld\n", RegError); return; }
printf("Successfully installed transport for NWCWorkstation\n"); }
}
DWORD TestOpenSCManager( OUT LPSC_HANDLE hScManager, IN LPWSTR DatabaseName, IN DWORD DesiredAccess, IN DWORD ExpectedError ) { DWORD status = NO_ERROR;
if (DatabaseName != NULL) { printf("OpenSCManager: DatabaseName=%ws, DesiredAccess=%08lx\n", DatabaseName, DesiredAccess); } else { printf("OpenSCManager: DatabaseName=(null), DesiredAccess=%08lx\n", DesiredAccess); }
*hScManager = OpenSCManager( NULL, DatabaseName, DesiredAccess );
if (*hScManager == (SC_HANDLE) NULL) {
status = GetLastError();
if (ExpectedError != status) { printf(" FAILED. Expected %lu, got %lu\n", ExpectedError, status); return status; } } else { if (ExpectedError != NO_ERROR) { printf(" FAILED. Expected %lu, got NO_ERROR\n", ExpectedError); return NO_ERROR; } }
printf(" Got %lu as expected\n", status);
return status;
}
DWORD TestCreateService( IN SC_HANDLE hScManager, IN LPWSTR ServiceName, IN DWORD ServiceType, IN LPWSTR BinaryPath, IN LPWSTR Dependencies ) { DWORD status = NO_ERROR; SC_HANDLE hService;
hService = CreateService( hScManager, ServiceName, NULL, 0, ServiceType, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, BinaryPath, NULL, NULL, Dependencies, NULL, NULL );
if (hService == (SC_HANDLE) NULL) { status = GetLastError(); printf("CreateService: %ws failed %lu\n", ServiceName, status); return status; }
printf("CreateService: Successfully created %ws\n", ServiceName);
(void) CloseServiceHandle(hService);
return status; }
|