Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

339 lines
8.5 KiB

#include "precomp.h"
//
// Taken from windows\wmi\mofcheck\mofcheck.c
//
//+-------------------------------------------------------------------------
//
// Function: HexStringToDword (private)
//
// Synopsis: scan lpsz for a number of hex digits (at most 8); update lpsz
// return value in Value; check for chDelim;
//
// Arguments: [lpsz] - the hex string to convert
// [Value] - the returned value
// [cDigits] - count of digits
//
// Returns: TRUE for success
//
//--------------------------------------------------------------------------
BOOL HexStringToDword(LPCWSTR lpsz, DWORD * RetValue,
int cDigits, WCHAR chDelim)
{
int Count;
DWORD Value;
Value = 0;
for (Count = 0; Count < cDigits; Count++, lpsz++)
{
if (*lpsz >= '0' && *lpsz <= '9')
Value = (Value << 4) + *lpsz - '0';
else if (*lpsz >= 'A' && *lpsz <= 'F')
Value = (Value << 4) + *lpsz - 'A' + 10;
else if (*lpsz >= 'a' && *lpsz <= 'f')
Value = (Value << 4) + *lpsz - 'a' + 10;
else
return(FALSE);
}
*RetValue = Value;
if (chDelim != 0)
return *lpsz++ == chDelim;
else
return TRUE;
}
//+-------------------------------------------------------------------------
//
// Function: wUUIDFromString (internal)
//
// Synopsis: Parse UUID such as 00000000-0000-0000-0000-000000000000
//
// Arguments: [lpsz] - Supplies the UUID string to convert
// [pguid] - Returns the GUID.
//
// Returns: TRUE if successful
//
//--------------------------------------------------------------------------
BOOL wUUIDFromString(LPCWSTR lpsz, LPGUID pguid)
{
DWORD dw;
if (!HexStringToDword(lpsz, &pguid->Data1, sizeof(DWORD)*2, '-'))
return FALSE;
lpsz += sizeof(DWORD)*2 + 1;
if (!HexStringToDword(lpsz, &dw, sizeof(WORD)*2, '-'))
return FALSE;
lpsz += sizeof(WORD)*2 + 1;
pguid->Data2 = (WORD)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(WORD)*2, '-'))
return FALSE;
lpsz += sizeof(WORD)*2 + 1;
pguid->Data3 = (WORD)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[0] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, '-'))
return FALSE;
lpsz += sizeof(BYTE)*2+1;
pguid->Data4[1] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[2] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[3] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[4] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[5] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[6] = (BYTE)dw;
if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0))
return FALSE;
lpsz += sizeof(BYTE)*2;
pguid->Data4[7] = (BYTE)dw;
return TRUE;
}
//+-------------------------------------------------------------------------
//
// Function: wGUIDFromString (internal)
//
// Synopsis: Parse GUID such as {00000000-0000-0000-0000-000000000000}
//
// Arguments: [lpsz] - the guid string to convert
// [pguid] - guid to return
//
// Returns: TRUE if successful
//
//--------------------------------------------------------------------------
BOOL wGUIDFromString(LPCWSTR lpsz, LPGUID pguid)
{
DWORD dw;
if (*lpsz == '{' )
lpsz++;
if(wUUIDFromString(lpsz, pguid) != TRUE)
return FALSE;
lpsz +=36;
if (*lpsz == '}' )
lpsz++;
if (*lpsz != '\0') // check for zero terminated string - test bug #18307
{
return FALSE;
}
return TRUE;
}
DWORD
EnablePrivilege(
LPCTSTR pszPrivilege
)
{
DWORD dwError = 0;
BOOL bStatus = FALSE;
HANDLE hTokenHandle = NULL;
TOKEN_PRIVILEGES NewState;
TOKEN_PRIVILEGES PreviousState;
DWORD dwReturnLength = 0;
bStatus = OpenThreadToken(
GetCurrentThread(),
TOKEN_ALL_ACCESS,
TRUE,
&hTokenHandle
);
if (!bStatus) {
bStatus = OpenProcessToken(
GetCurrentProcess(),
TOKEN_ALL_ACCESS,
&hTokenHandle
);
if (!bStatus) {
dwError = GetLastError();
BAIL_ON_WIN32_ERROR(dwError);
}
}
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bStatus = LookupPrivilegeValue(
NULL,
pszPrivilege,
&NewState.Privileges[0].Luid
);
if (!bStatus) {
dwError = GetLastError();
BAIL_ON_WIN32_ERROR(dwError);
}
bStatus = AdjustTokenPrivileges(
hTokenHandle,
FALSE,
&NewState,
sizeof(PreviousState),
&PreviousState,
&dwReturnLength
);
if (!bStatus) {
dwError = GetLastError();
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hTokenHandle) {
CloseHandle(hTokenHandle);
}
return (dwError);
}
BOOL
IsStringInArray(
LPWSTR * ppszStrings,
LPWSTR pszKey,
DWORD dwNumStrings
)
{
DWORD j = 0;
for (j = 0; j < dwNumStrings; j++) {
if (!_wcsicmp(*(ppszStrings+j), pszKey)) {
return TRUE;
}
}
return FALSE;
}
// Description:
//
// Pastore function that uses above time routine to convert
// from LDAP UTC Generalized time coding to time_t
// Generalized time syntax has the form
// YYYYMMDDHHMMSS[.|,fraction][(+|-HHMM)|Z]
// Z means UTC.
//
//
// Arguments:
//
// pszGenTime: UTC time in generalized time format as above.
// ptTime: Converted time in time_t format.
//
// Assumptions:
// Always assume UTC and never expect or check (+|-HHMM)
// since DC time returned is in UTC.
//
// Return value:
// WIN32 error or ERROR_SUCCESS
DWORD
GeneralizedTimeToTime(
IN LPWSTR pszGenTime,
OUT time_t * ptTime
)
{
DWORD dwError = ERROR_SUCCESS;
DWORD dwLen = 0;
DWORD dwNumFields = 0;
DWORD dwTrueYear = 0;
struct tm tmTimeStruct;
time_t tTime = 0;
dwLen = wcslen(pszGenTime);
if (dwLen < MIN_GEN_UTC_LEN ||
!( pszGenTime[MIN_GEN_UTC_LEN-1] == L'.' ||
pszGenTime[MIN_GEN_UTC_LEN-1] == L','))
{
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
// First convert to tm struct format
//
memset(&tmTimeStruct, 0, sizeof(struct tm));
dwNumFields = _snwscanf(
pszGenTime, MIN_GEN_UTC_LEN, L"%04d%02d%02d%02d%02d%02d",
&dwTrueYear, &tmTimeStruct.tm_mon, &tmTimeStruct.tm_mday,
&tmTimeStruct.tm_hour, &tmTimeStruct.tm_min, &tmTimeStruct.tm_sec
);
if (dwNumFields != 6 || dwTrueYear < 1900)
{
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
tmTimeStruct.tm_year = dwTrueYear - 1900;
// Month is zero-based so...
//
if (tmTimeStruct.tm_mon <= 0)
{
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
tmTimeStruct.tm_mon--;
// Now convert to time_t
//
tTime = _mkgmtime(&tmTimeStruct);
if (tTime == (time_t) -1)
{
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
*ptTime = tTime;
return dwError;
error:
return dwError;
}