/*++ Copyright (c) 1996 Microsoft Corporation Module Name: util.c Abstract: Shared utility routines Author: Jin Huang (jinhuang) 14-Jul-1997 Revision History: --*/ #include "util.h" #pragma hdrstop DWORD SmbsvcpRegQueryIntValue( IN HKEY hKeyRoot, IN PWSTR SubKey, IN PWSTR ValueName, OUT DWORD *Value ) /* ++ Routine Description: This routine queries a REG_DWORD value from a value name/subkey. Arguments: hKeyRoot - root SubKey - key path ValueName - name of the value Value - the output value for the ValueName Return values: Win32 error code -- */ { DWORD Rcode; DWORD RegType; DWORD dSize=0; HKEY hKey=NULL; if(( Rcode = RegOpenKeyEx(hKeyRoot, SubKey, 0, KEY_READ, &hKey )) == ERROR_SUCCESS ) { if(( Rcode = RegQueryValueEx(hKey, ValueName, 0, &RegType, NULL, &dSize )) == ERROR_SUCCESS ) { switch (RegType) { case REG_DWORD: case REG_DWORD_BIG_ENDIAN: Rcode = RegQueryValueEx(hKey, ValueName, 0, &RegType, (BYTE *)Value, &dSize ); if ( Rcode != ERROR_SUCCESS ) { if ( Value != NULL ) *Value = 0; } break; default: Rcode = ERROR_INVALID_DATATYPE; break; } } } if( hKey ) RegCloseKey( hKey ); return(Rcode); } DWORD SmbsvcpRegSetIntValue( IN HKEY hKeyRoot, IN PWSTR SubKey, IN PWSTR ValueName, IN DWORD Value ) /* ++ Routine Description: This routine sets a REG_DWORD value to a value name/subkey. Arguments: hKeyRoot - root SubKey - key path ValueName - name of the value Value - the value to set Return values: Win32 error code -- */ { DWORD Rcode; HKEY hKey=NULL; if(( Rcode = RegOpenKeyEx(hKeyRoot, SubKey, 0, KEY_SET_VALUE, &hKey )) == ERROR_SUCCESS ) { Rcode = RegSetValueEx( hKey, ValueName, 0, REG_DWORD, (BYTE *)&Value, 4 ); } if( hKey ) RegCloseKey( hKey ); return(Rcode); } DWORD SmbsvcpRegSetValue( IN HKEY hKeyRoot, IN PWSTR SubKey, IN PWSTR ValueName, IN DWORD RegType, IN BYTE *Value, IN DWORD ValueLen ) /* ++ Routine Description: This routine sets a string value to a value name/subkey. Arguments: hKeyRoot - root SubKey - key path ValueName - name of the value Value - the value to set ValueLen - The number of bytes in Value Return values: Win32 error code -- */ { DWORD Rcode; DWORD NewKey; HKEY hKey=NULL; SECURITY_ATTRIBUTES SecurityAttributes; PSECURITY_DESCRIPTOR SecurityDescriptor=NULL; if(( Rcode = RegOpenKeyEx(hKeyRoot, SubKey, 0, KEY_SET_VALUE, &hKey )) != ERROR_SUCCESS ) { SecurityAttributes.nLength = sizeof( SECURITY_ATTRIBUTES ); SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor; SecurityAttributes.bInheritHandle = FALSE; Rcode = RegCreateKeyEx( hKeyRoot, SubKey, 0, NULL, // LPTSTR lpClass, 0, KEY_SET_VALUE, NULL, // &SecurityAttributes, &hKey, &NewKey ); } if ( Rcode == ERROR_SUCCESS ) { Rcode = RegSetValueEx( hKey, ValueName, 0, RegType, Value, ValueLen ); } if( hKey ) RegCloseKey( hKey ); return(Rcode); } DWORD SmbsvcpRegQueryValue( IN HKEY hKeyRoot, IN PWSTR SubKey, IN PCWSTR ValueName, OUT PVOID *Value, OUT LPDWORD pRegType ) /* ++ Routine Description: This routine queries a REG_SZ value from a value name/subkey. The output buffer is allocated if it is NULL. It must be freed by LocalFree Arguments: hKeyRoot - root SubKey - key path ValueName - name of the value Value - the output string for the ValueName Return values: Win32 error code -- */ { DWORD Rcode; DWORD dSize=0; HKEY hKey=NULL; BOOL FreeMem=FALSE; if ( SubKey == NULL || ValueName == NULL || Value == NULL || pRegType == NULL ) { return(SCESTATUS_INVALID_PARAMETER); } if(( Rcode = RegOpenKeyEx(hKeyRoot, SubKey, 0, KEY_READ, &hKey )) == ERROR_SUCCESS ) { if(( Rcode = RegQueryValueEx(hKey, ValueName, 0, pRegType, NULL, &dSize )) == ERROR_SUCCESS ) { switch (*pRegType) { case REG_DWORD: case REG_DWORD_BIG_ENDIAN: Rcode = RegQueryValueEx(hKey, ValueName, 0, pRegType, (BYTE *)(*Value), &dSize ); if ( Rcode != ERROR_SUCCESS ) { if ( *Value != NULL ) *((BYTE *)(*Value)) = 0; } break; case REG_SZ: case REG_EXPAND_SZ: case REG_MULTI_SZ: if ( *Value == NULL ) { *Value = (PVOID)LocalAlloc( LMEM_ZEROINIT, (dSize+1)*sizeof(TCHAR)); FreeMem = TRUE; } if ( *Value == NULL ) { Rcode = ERROR_NOT_ENOUGH_MEMORY; } else { Rcode = RegQueryValueEx(hKey, ValueName, 0, pRegType, (BYTE *)(*Value), &dSize ); if ( Rcode != ERROR_SUCCESS && FreeMem ) { LocalFree(*Value); *Value = NULL; } } break; default: Rcode = ERROR_INVALID_DATATYPE; break; } } } if( hKey ) RegCloseKey( hKey ); return(Rcode); } DWORD SmbsvcpSceStatusToDosError( IN SCESTATUS SceStatus ) // converts SCESTATUS error code to dos error defined in winerror.h { switch(SceStatus) { case SCESTATUS_SUCCESS: return(NO_ERROR); case SCESTATUS_OTHER_ERROR: return(ERROR_EXTENDED_ERROR); case SCESTATUS_INVALID_PARAMETER: return(ERROR_INVALID_PARAMETER); case SCESTATUS_RECORD_NOT_FOUND: return(ERROR_NO_MORE_ITEMS); case SCESTATUS_INVALID_DATA: return(ERROR_INVALID_DATA); case SCESTATUS_OBJECT_EXIST: return(ERROR_FILE_EXISTS); case SCESTATUS_BUFFER_TOO_SMALL: return(ERROR_INSUFFICIENT_BUFFER); case SCESTATUS_PROFILE_NOT_FOUND: return(ERROR_FILE_NOT_FOUND); case SCESTATUS_BAD_FORMAT: return(ERROR_BAD_FORMAT); case SCESTATUS_NOT_ENOUGH_RESOURCE: return(ERROR_NOT_ENOUGH_MEMORY); case SCESTATUS_ACCESS_DENIED: return(ERROR_ACCESS_DENIED); case SCESTATUS_CANT_DELETE: return(ERROR_CURRENT_DIRECTORY); case SCESTATUS_PREFIX_OVERFLOW: return(ERROR_BUFFER_OVERFLOW); case SCESTATUS_ALREADY_RUNNING: return(ERROR_SERVICE_ALREADY_RUNNING); case SCESTATUS_SERVICE_NOT_SUPPORT: return(ERROR_NOT_SUPPORTED); default: return(ERROR_EXTENDED_ERROR); } } SCESTATUS SmbsvcpDosErrorToSceStatus( DWORD rc ) { switch(rc) { case NO_ERROR: return(SCESTATUS_SUCCESS); case ERROR_INVALID_PARAMETER: return(SCESTATUS_INVALID_PARAMETER); case ERROR_INVALID_DATA: return(SCESTATUS_INVALID_DATA); case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: return(SCESTATUS_PROFILE_NOT_FOUND); case ERROR_ACCESS_DENIED: case ERROR_SHARING_VIOLATION: case ERROR_LOCK_VIOLATION: case ERROR_NETWORK_ACCESS_DENIED: return(SCESTATUS_ACCESS_DENIED); case ERROR_NOT_ENOUGH_MEMORY: case ERROR_OUTOFMEMORY: return(SCESTATUS_NOT_ENOUGH_RESOURCE); case ERROR_BAD_FORMAT: return(SCESTATUS_BAD_FORMAT); case ERROR_CURRENT_DIRECTORY: return(SCESTATUS_CANT_DELETE); case ERROR_SECTOR_NOT_FOUND: case ERROR_NONE_MAPPED: case ERROR_SERVICE_DOES_NOT_EXIST: case ERROR_RESOURCE_DATA_NOT_FOUND: case ERROR_NO_MORE_ITEMS: #if !defined(_NT4BACK_PORT) case ERROR_INVALID_TRANSFORM: #endif return(SCESTATUS_RECORD_NOT_FOUND); case ERROR_DUP_NAME: case ERROR_FILE_EXISTS: return(SCESTATUS_OBJECT_EXIST); case ERROR_BUFFER_OVERFLOW: return(SCESTATUS_PREFIX_OVERFLOW); case ERROR_INSUFFICIENT_BUFFER: return(SCESTATUS_BUFFER_TOO_SMALL); case ERROR_SERVICE_ALREADY_RUNNING: return(SCESTATUS_ALREADY_RUNNING); case ERROR_NOT_SUPPORTED: return(SCESTATUS_SERVICE_NOT_SUPPORT); default: return(SCESTATUS_OTHER_ERROR); } }