windows-nt/Source/XPSP1/NT/ds/security/services/scerpc/fileshr/util.cpp
2020-09-26 16:20:57 +08:00

489 lines
11 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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);
}
}