diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/svcdlls/nwwks/server/inswks.c | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/private/nw/svcdlls/nwwks/server/inswks.c b/private/nw/svcdlls/nwwks/server/inswks.c new file mode 100644 index 000000000..5aed5e1a9 --- /dev/null +++ b/private/nw/svcdlls/nwwks/server/inswks.c @@ -0,0 +1,320 @@ +/*++ + +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 _CRTAPI1 +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; +} |