Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

165 lines
3.4 KiB

/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// Utils.cpp
#include "stdafx.h"
#include "utils.h"
#include <cominit.h>
HRESULT EnableAllPrivileges(DWORD dwTokenType)
{
// Open thread token
// =================
HANDLE hToken = NULL;
BOOL bRes;
switch (dwTokenType)
{
case TOKEN_THREAD:
bRes = OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, TRUE, &hToken);
break;
case TOKEN_PROCESS:
bRes = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);
break;
}
if(!bRes)
return WBEM_E_ACCESS_DENIED;
// Get the privileges
// ==================
DWORD dwLen;
TOKEN_USER tu;
memset(&tu,0,sizeof(TOKEN_USER));
bRes = GetTokenInformation(hToken, TokenPrivileges, &tu, sizeof(TOKEN_USER), &dwLen);
BYTE* pBuffer = new BYTE[dwLen];
if(pBuffer == NULL)
{
CloseHandle(hToken);
return WBEM_E_OUT_OF_MEMORY;
}
bRes = GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwLen,
&dwLen);
if(!bRes)
{
CloseHandle(hToken);
delete [] pBuffer;
return WBEM_E_ACCESS_DENIED;
}
// Iterate through all the privileges and enable them all
// ======================================================
TOKEN_PRIVILEGES* pPrivs = (TOKEN_PRIVILEGES*)pBuffer;
for(DWORD i = 0; i < pPrivs->PrivilegeCount; i++)
{
pPrivs->Privileges[i].Attributes |= SE_PRIVILEGE_ENABLED;
}
// Store the information back into the token
// =========================================
bRes = AdjustTokenPrivileges(hToken, FALSE, pPrivs, 0, NULL, NULL);
delete [] pBuffer;
CloseHandle(hToken);
if(!bRes)
return WBEM_E_ACCESS_DENIED;
else
return WBEM_S_NO_ERROR;
}
BOOL GetFileVersion(LPCTSTR szFN, LPTSTR szVersion)
{
DWORD dwCount,
dwHandle,
dwValueLen;
BOOL bRet;
char *pcValue,
*pc,
*pBuffer,
szFileName[MAX_PATH],
szQuery[100];
lstrcpy(szFileName, szFN);
if ((dwCount = GetFileVersionInfoSize(szFileName, &dwHandle)) != 0)
{
pBuffer = new char[dwCount];
if (!pBuffer)
return FALSE;
if (GetFileVersionInfo(szFileName, dwHandle, dwCount, pBuffer) != 0)
{
VerQueryValue(pBuffer, "\\VarFileInfo\\Translation",
(void **) &pcValue, (UINT *) &dwValueLen);
if (dwValueLen != 0)
{
wsprintf(szQuery, "\\StringFileInfo\\%04X%04X\\FileVersion",
*(WORD *)pcValue, *(WORD *)(pcValue+2));
bRet = VerQueryValue(pBuffer, szQuery, (void **) &pcValue,
(UINT *) &dwValueLen);
if (bRet)
{
while ((pc = strchr(pcValue, '(')) != NULL)
*pc = '{';
while ((pc = strchr(pcValue, ')')) != NULL)
*pc = '}';
_tcscpy(szVersion, pcValue);
delete pBuffer;
return TRUE;
}
}
}
delete pBuffer;
}
return FALSE;
}
void SetSecurityHelper(
IUnknown *pUnk,
BSTR pAuthority,
BSTR pUser,
BSTR pPassword,
DWORD dwImpLevel,
DWORD dwAuthLevel)
{
BSTR pPrincipal = NULL;
COAUTHIDENTITY *pAuthIdentity = NULL;
SetInterfaceSecurityEx(
pUnk,
pAuthority,
pUser,
pPassword,
dwAuthLevel,
dwImpLevel,
EOAC_NONE,
&pAuthIdentity,
&pPrincipal);
if (pPrincipal)
SysFreeString(pPrincipal);
if (pAuthIdentity)
WbemFreeAuthIdentity(pAuthIdentity);
}