489 lines
11 KiB
C++
489 lines
11 KiB
C++
|
/*++
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|