//************************************************************* // // Copyright (c) Microsoft Corporation 1998 // All rights reserved // // util.cxx // //************************************************************* #include "common.hxx" MSGWAITFORMULTIPLEOBJECTS * pfnMsgWaitForMultipleObjects = 0; PEEKMESSAGEW * pfnPeekMessageW = 0; TRANSLATEMESSAGE * pfnTranslateMessage = 0; DISPATCHMESSAGEW * pfnDispatchMessageW = 0; GETPROCESSWINDOWSTATION * pfnGetProcessWindowStation = 0; CLOSEWINDOWSTATION * pfnCloseWindowStation = 0; GETUSEROBJECTINFORMATIONW * pfnGetUserObjectInformationW = 0; MSISETINTERNALUI * gpfnMsiSetInternalUI = 0; MSICONFIGUREPRODUCTEXW * gpfnMsiConfigureProductEx = 0; MSIPROVIDECOMPONENTFROMDESCRIPTORW * gpfnMsiProvideComponentFromDescriptor = 0; MSIDECOMPOSEDESCRIPTORW * gpfnMsiDecomposeDescriptor = 0; MSIGETPRODUCTINFOW * gpfnMsiGetProductInfo = 0; MSIADVERTISESCRIPTW * gpfnMsiAdvertiseScript = 0; MSIQUERYPRODUCTSTATEW * gpfnMsiQueryProductState = 0; MSIISPRODUCTELEVATEDW * gpfnMsiIsProductElevated = 0; MSIREINSTALLPRODUCTW * gpfnMsiReinstallProduct = 0; void FreeApplicationInfo( APPLICATION_INFO * ApplicationInfo ) { if ( ! ApplicationInfo ) return; LocalFree( ApplicationInfo->pwszDeploymentId ); LocalFree( ApplicationInfo->pwszDeploymentName ); LocalFree( ApplicationInfo->pwszGPOName ); LocalFree( ApplicationInfo->pwszProductCode ); LocalFree( ApplicationInfo->pwszDescriptor ); LocalFree( ApplicationInfo->pwszSetupCommand ); } PSID AppmgmtGetUserSid( HANDLE hUserToken // = 0 ) { PSID pSid; HANDLE hToken; PTOKEN_USER pTokenUserData; UCHAR Buffer[sizeof(TOKEN_USER) + sizeof(SID) + ((SID_MAX_SUB_AUTHORITIES-1) * sizeof(ULONG))]; DWORD Size; DWORD Status; BOOL bStatus; if ( ! hUserToken ) { bStatus = OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken ); if ( ! bStatus ) bStatus = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken ); if ( ! bStatus ) return NULL; } else { hToken = hUserToken; } Size = sizeof(Buffer); pTokenUserData = (PTOKEN_USER) Buffer; bStatus = GetTokenInformation( hToken, TokenUser, pTokenUserData, Size, &Size ); if ( ! hUserToken ) CloseHandle( hToken ); if ( ! bStatus ) return NULL; Size = GetLengthSid( pTokenUserData->User.Sid ); pSid = (PSID) LocalAlloc( 0, Size ); if ( pSid ) { bStatus = CopySid( Size, pSid, pTokenUserData->User.Sid ); if ( ! bStatus ) { LocalFree( pSid ); pSid = NULL; } } return pSid; } void DwordToString( DWORD Number, WCHAR * wszNumber ) { WCHAR * pwszString; WCHAR c; DWORD Length; DWORD n; pwszString = wszNumber; Length = 0; do { *pwszString++ = (WCHAR) (L'0' + Number % 10); Number /= 10; Length++; } while ( Number ); *pwszString = 0; for ( n = 0; n < Length / 2; n++ ) { c = wszNumber[n]; wszNumber[n] = wszNumber[Length-n-1]; wszNumber[Length-n-1] = c; } } BOOL LoadUser32Funcs() { HINSTANCE hUser32 = 0; if ( pfnMsgWaitForMultipleObjects && pfnPeekMessageW && pfnTranslateMessage && pfnDispatchMessageW && pfnGetProcessWindowStation && pfnCloseWindowStation && pfnGetUserObjectInformationW ) return TRUE; hUser32 = LoadLibrary( L"user32.dll" ); if ( ! hUser32 ) return FALSE; pfnMsgWaitForMultipleObjects = (MSGWAITFORMULTIPLEOBJECTS *) GetProcAddress( hUser32, "MsgWaitForMultipleObjects" ); pfnPeekMessageW = (PEEKMESSAGEW *) GetProcAddress( hUser32, "PeekMessageW" ); pfnTranslateMessage = (TRANSLATEMESSAGE *) GetProcAddress( hUser32, "TranslateMessage" ); pfnDispatchMessageW = (DISPATCHMESSAGEW *) GetProcAddress( hUser32, "DispatchMessageW" ); pfnGetProcessWindowStation = (GETPROCESSWINDOWSTATION *) GetProcAddress( hUser32, "GetProcessWindowStation" ); pfnCloseWindowStation = (CLOSEWINDOWSTATION *) GetProcAddress( hUser32, "CloseWindowStation" ); pfnGetUserObjectInformationW = (GETUSEROBJECTINFORMATIONW *) GetProcAddress( hUser32, "GetUserObjectInformationW" ); if ( ! pfnMsgWaitForMultipleObjects || ! pfnPeekMessageW || ! pfnTranslateMessage || ! pfnDispatchMessageW || ! pfnGetProcessWindowStation || ! pfnCloseWindowStation || ! pfnGetUserObjectInformationW ) { FreeLibrary( hUser32 ); return FALSE; } // user32 remains loaded return TRUE; } BOOL LoadLoadString() { HINSTANCE hUser32 = 0; if ( pfnLoadStringW ) return TRUE; hUser32 = LoadLibrary( L"user32.dll" ); if ( ! hUser32 ) return FALSE; pfnLoadStringW = (LOADSTRINGW *) GetProcAddress( hUser32, "LoadStringW" ); if ( ! pfnLoadStringW ) { FreeLibrary( hUser32 ); return FALSE; } // user32 remains loaded return TRUE; } void GuidToString( GUID & Guid, PWCHAR pwszGuid ) { *pwszGuid = 0; StringCchPrintf( pwszGuid, 40, L"{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", Guid.Data1, Guid.Data2, Guid.Data3, Guid.Data4[0], Guid.Data4[1], Guid.Data4[2], Guid.Data4[3], Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7] ); } void GuidToString( GUID & Guid, PWCHAR *ppwszGuid ) { *ppwszGuid = new WCHAR[40]; if ( *ppwszGuid ) GuidToString( Guid, *ppwszGuid); } void StringToGuid( PWCHAR pwszGuid, GUID * pGuid ) { UNICODE_STRING String; DWORD Data; // mimicking scanf of L"{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}" if (lstrlen(pwszGuid) != GUID_LENGTH) { memset(pGuid, 0, sizeof(GUID)); return; } String.Buffer = pwszGuid + 1; String.Length = String.MaximumLength = 16; RtlUnicodeStringToInteger( &String, 16, &pGuid->Data1 ); String.Buffer += 9; String.Length = String.MaximumLength = 8; RtlUnicodeStringToInteger( &String, 16, &Data ); pGuid->Data2 = (USHORT) Data; String.Buffer += 5; RtlUnicodeStringToInteger( &String, 16, &Data ); pGuid->Data3 = (USHORT) Data; String.Buffer += 5; String.Length = String.MaximumLength = 4; for ( DWORD n = 0; n <= 7; n++ ) { RtlUnicodeStringToInteger( &String, 16, &Data ); pGuid->Data4[n] = (UCHAR) Data; String.Buffer += 2; if ( 1 == n ) String.Buffer++; } } HRESULT CreateGuid(GUID *pGuid) { int err; // We simply use the RPC system supplied API if ((err = UuidCreate(pGuid)) != RPC_S_UUID_LOCAL_ONLY) { return err ? HRESULT_FROM_WIN32(err) : S_OK; } return S_OK; } DWORD ReadStringValue( HKEY hKey, WCHAR * pwszValueName, WCHAR ** ppwszValue ) { DWORD Status; DWORD Size; *ppwszValue = 0; Size = 0; Status = RegQueryValueEx( hKey, pwszValueName, 0, NULL, (LPBYTE) *ppwszValue, &Size ); // // Does not return ERROR_MORE_DATA when buffer is NULL. // if ( Status != ERROR_SUCCESS ) return Status; *ppwszValue = new WCHAR[Size / 2]; if ( ! *ppwszValue ) return ERROR_OUTOFMEMORY; Status = RegQueryValueEx( hKey, pwszValueName, 0, NULL, (LPBYTE) *ppwszValue, &Size ); if ( Status != ERROR_SUCCESS ) { delete *ppwszValue; *ppwszValue = 0; } return Status; } DWORD GetSidString( HANDLE hToken, UNICODE_STRING* pSidString ) { LONG Status; BOOL bStatus; DWORD Size; UCHAR Buffer[sizeof(TOKEN_USER) + sizeof(SID) + ((SID_MAX_SUB_AUTHORITIES-1) * sizeof(ULONG))]; PTOKEN_USER pTokenUser; Status = ERROR_SUCCESS; Size = sizeof(Buffer); pTokenUser = (PTOKEN_USER) Buffer; bStatus = GetTokenInformation( hToken, TokenUser, pTokenUser, Size, &Size ); if ( ! bStatus ) Status = GetLastError(); if ( ERROR_SUCCESS == Status ) { Status = RtlConvertSidToUnicodeString( pSidString, pTokenUser->User.Sid, TRUE ); if ( ! NT_SUCCESS( Status ) ) { Status = RtlNtStatusToDosError( Status ); } } return Status; } CLoadMsi::CLoadMsi( DWORD &Status ) { hMsi = LoadLibrary( L"msi.dll" ); if ( ! hMsi ) { Status = GetLastError(); return; } gpfnMsiSetInternalUI = (MSISETINTERNALUI *) GetProcAddress( hMsi, "MsiSetInternalUI" ); gpfnMsiConfigureProductEx = (MSICONFIGUREPRODUCTEXW *) GetProcAddress( hMsi, "MsiConfigureProductExW" ); gpfnMsiProvideComponentFromDescriptor = (MSIPROVIDECOMPONENTFROMDESCRIPTORW *) GetProcAddress( hMsi, "MsiProvideComponentFromDescriptorW" ); gpfnMsiDecomposeDescriptor = (MSIDECOMPOSEDESCRIPTORW *) GetProcAddress( hMsi, "MsiDecomposeDescriptorW" ); gpfnMsiGetProductInfo = (MSIGETPRODUCTINFOW *) GetProcAddress( hMsi, "MsiGetProductInfoW" ); gpfnMsiAdvertiseScript = (MSIADVERTISESCRIPTW *) GetProcAddress( hMsi, "MsiAdvertiseScriptW" ); gpfnMsiQueryProductState = (MSIQUERYPRODUCTSTATEW *) GetProcAddress( hMsi, "MsiQueryProductStateW" ); gpfnMsiIsProductElevated = (MSIISPRODUCTELEVATEDW *) GetProcAddress( hMsi, "MsiIsProductElevatedW" ); gpfnMsiReinstallProduct = (MSIREINSTALLPRODUCTW *) GetProcAddress( hMsi, "MsiReinstallProductW" ); if ( ! gpfnMsiSetInternalUI || ! gpfnMsiConfigureProductEx || ! gpfnMsiProvideComponentFromDescriptor || ! gpfnMsiDecomposeDescriptor || ! gpfnMsiAdvertiseScript || ! gpfnMsiQueryProductState || ! gpfnMsiIsProductElevated || ! gpfnMsiReinstallProduct ) { Status = ERROR_PROC_NOT_FOUND; return; } Status = ERROR_SUCCESS; } CLoadMsi::~CLoadMsi() { if ( hMsi ) FreeLibrary( hMsi ); }