windows-nt/Source/XPSP1/NT/termsrv/setup/dll/util.cpp
2020-09-26 16:20:57 +08:00

477 lines
9.9 KiB
C++

//Copyright (c) 1998 - 1999 Microsoft Corporation
/*
*
* Util.cpp
*
* Utility routines.
*
*/
//
// Includes
//
#include "stdafx.h"
#include "hydraoc.h"
//
// Globals
//
HINSTANCE ghInstance = NULL;
PEXTRA_ROUTINES gpExtraRoutines = NULL;
// PSETUP_INIT_COMPONENT gpInitComponentData = NULL;
//
// Function Definitions
//
VOID
DestroyExtraRoutines(
VOID
)
{
if (gpExtraRoutines != NULL) {
LocalFree(gpExtraRoutines);
}
}
BOOL
DoMessageBox(
UINT uiMsg
)
{
TCHAR strMsg[1024];
TCHAR strTitle[1024];
ASSERT(!StateObject.IsUnattended());
if ((LoadString(GetInstance(), IDS_STRING_MESSAGE_BOX_TITLE, strTitle, 1024) != 0) &&
(LoadString(GetInstance(), uiMsg, strMsg, 1024) != 0))
{
MessageBox(
GetHelperRoutines().QueryWizardDialogHandle(GetHelperRoutines().OcManagerContext),
strMsg,
strTitle,
MB_OK
);
return(TRUE);
}
return(FALSE);
}
HINF
GetComponentInfHandle(
VOID
)
{
if (INVALID_HANDLE_VALUE == GetSetupData()->ComponentInfHandle) {
return(NULL);
} else {
return(GetSetupData()->ComponentInfHandle);
}
}
EXTRA_ROUTINES
GetExtraRoutines(
VOID
)
{
return(*gpExtraRoutines);
}
OCMANAGER_ROUTINES
GetHelperRoutines(
VOID
)
{
return(GetSetupData()->HelperRoutines);
}
HINSTANCE
GetInstance(
VOID
)
{
ASSERT(ghInstance);
return(ghInstance);
}
HINF
GetUnAttendedInfHandle(
VOID
)
{
ASSERT(StateObject.IsUnattended());
return(GetHelperRoutines().GetInfHandle(INFINDEX_UNATTENDED,GetHelperRoutines().OcManagerContext));
}
VOID
LogErrorToEventLog(
WORD wType,
WORD wCategory,
DWORD dwEventId,
WORD wNumStrings,
DWORD dwDataSize,
LPCTSTR *lpStrings,
LPVOID lpRawData
)
{
HANDLE hEventLog;
hEventLog = RegisterEventSource(NULL, TS_EVENT_SOURCE);
if (hEventLog != NULL) {
if (!ReportEvent(
hEventLog,
wType,
wCategory,
dwEventId,
NULL,
wNumStrings,
dwDataSize,
lpStrings,
lpRawData
)) {
LOGMESSAGE1(_T("ReportEvent failed %ld"), GetLastError());
}
DeregisterEventSource(hEventLog);
} else {
LOGMESSAGE1(_T("RegisterEventSource failed %ld"), GetLastError());
return;
}
}
VOID
LogErrorToSetupLog(
OcErrorLevel ErrorLevel,
UINT uiMsg,
...
)
{
TCHAR szFormat[1024];
TCHAR szOutput[1024];
if (LoadString(GetInstance(), uiMsg, szFormat, 1024) != 0) {
va_list vaList;
va_start(vaList, uiMsg);
_vstprintf(szOutput, szFormat, vaList);
va_end(vaList);
GetExtraRoutines().LogError(
GetHelperRoutines().OcManagerContext,
ErrorLevel,
szOutput
);
}
}
VOID
SetInstance(
HINSTANCE hInstance
)
{
ghInstance = hInstance;
}
VOID
SetProgressText(
UINT uiMsg
)
{
TCHAR strMsg[1024];
if (LoadString(GetInstance(), uiMsg, strMsg, 1024) != 0) {
GetHelperRoutines().SetProgressText(GetHelperRoutines().OcManagerContext, strMsg);
}
}
BOOL
SetReboot(
VOID
)
{
return(GetHelperRoutines().SetReboot(GetHelperRoutines().OcManagerContext, 0));
}
BOOL
SetExtraRoutines(
PEXTRA_ROUTINES pExtraRoutines
)
{
if (pExtraRoutines->size != sizeof(EXTRA_ROUTINES)) {
LOGMESSAGE0(_T("WARNING: Extra Routines are a different size than expected!"));
}
gpExtraRoutines = (PEXTRA_ROUTINES)LocalAlloc(LPTR, pExtraRoutines->size);
if (gpExtraRoutines == NULL) {
return(FALSE);
}
CopyMemory(gpExtraRoutines, pExtraRoutines, pExtraRoutines->size);
return(TRUE);
}
BOOL Delnode( IN LPCTSTR Directory )
{
TCHAR szDirectory[MAX_PATH + 1];
TCHAR szPattern[MAX_PATH + 1];
WIN32_FIND_DATA FindData;
HANDLE FindHandle;
LOGMESSAGE0(_T("Delnode: Entered"));
//
// Delete each file in the given directory, then remove the directory
// itself. If any directories are encountered along the way recurse to
// delete them as they are encountered.
//
// Start by forming the search pattern, which is <currentdir>\*.
//
ExpandEnvironmentStrings(Directory, szDirectory, MAX_PATH);
LOGMESSAGE1(_T("Delnode: Deleting %s"), szDirectory);
_tcscpy(szPattern, szDirectory);
_tcscat(szPattern, _T("\\"));
_tcscat(szPattern, _T("*"));
//
// Start the search.
//
FindHandle = FindFirstFile(szPattern, &FindData);
if(FindHandle != INVALID_HANDLE_VALUE)
{
do
{
//
// Form the full name of the file or directory we just found.
//
_tcscpy(szPattern, szDirectory);
_tcscat(szPattern, _T("\\"));
_tcscat(szPattern, FindData.cFileName);
//
// Remove read-only atttribute if it's there.
//
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
{
SetFileAttributes(szPattern, FILE_ATTRIBUTE_NORMAL);
}
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//
// The current match is a directory. Recurse into it unless
// it's . or ...
//
if ((_tcsicmp(FindData.cFileName,_T("."))) &&
(_tcsicmp(FindData.cFileName,_T(".."))))
{
if (!Delnode(szPattern))
{
LOGMESSAGE1(_T("DelNode failed on %s"), szPattern);
}
}
}
else
{
//
// The current match is not a directory -- so delete it.
//
if (!DeleteFile(szPattern))
{
LOGMESSAGE2(_T("Delnode: %s not deleted: %d"), szPattern, GetLastError());
}
}
}
while(FindNextFile(FindHandle, &FindData));
FindClose(FindHandle);
}
//
// Remove the directory we just emptied out. Ignore errors.
//
if (!RemoveDirectory(szDirectory))
{
LOGMESSAGE2(_T("Failed to remove the directory %s (%d)"), szDirectory, GetLastError());
return FALSE;
}
return TRUE;
}
//+--------------------------------------------------------------------------
//
// Function: StoreSecretKey
//
// Synopsis: stores a key in the LSA
//
// Arguments: [pwszKeyName] -- the license server
// [pbKey] -- the product id to add license on
// [cbKey] -- the key pack type to add the license to
//
// Returns: returns a WinError code
//
// History: September 17, 1998 - created [hueiwang]
//
// Notes:
//
//---------------------------------------------------------------------------
DWORD StoreSecretKey(PWCHAR pwszKeyName, BYTE * pbKey, DWORD cbKey )
{
LSA_HANDLE PolicyHandle;
UNICODE_STRING SecretKeyName;
UNICODE_STRING SecretData;
DWORD Status;
if( ( NULL == pwszKeyName ) )
{
return( ERROR_INVALID_PARAMETER );
}
//
// setup the UNICODE_STRINGs for the call.
//
InitLsaString( &SecretKeyName, pwszKeyName );
SecretData.Buffer = ( LPWSTR )pbKey;
SecretData.Length = ( USHORT )cbKey;
SecretData.MaximumLength = ( USHORT )cbKey;
Status = OpenPolicy( NULL, POLICY_CREATE_SECRET, &PolicyHandle );
if( Status != ERROR_SUCCESS )
{
return LsaNtStatusToWinError(Status);
}
Status = LsaStorePrivateData(
PolicyHandle,
&SecretKeyName,
pbKey ? &SecretData : NULL
);
LsaClose(PolicyHandle);
return LsaNtStatusToWinError(Status);
}
//+--------------------------------------------------------------------------
//
// Function: OpenPolicy
//
// Synopsis: opens a policy of the LSA component
//
// Arguments: [ServerName] -- server
// [DesiredAccess] --
// [PociyHandle] --
//
// Returns: returns nt error code
//
// History: September 17, 1998 - created [hueiwang]
//
// Notes:
//
//---------------------------------------------------------------------------
DWORD OpenPolicy(LPWSTR ServerName,DWORD DesiredAccess,PLSA_HANDLE PolicyHandle )
{
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
LSA_UNICODE_STRING ServerString;
PLSA_UNICODE_STRING Server;
//
// Always initialize the object attributes to all zeroes.
//
ZeroMemory( &ObjectAttributes, sizeof( ObjectAttributes ) );
if( NULL != ServerName )
{
//
// Make a LSA_UNICODE_STRING out of the LPWSTR passed in
//
InitLsaString( &ServerString, ServerName );
Server = &ServerString;
}
else
{
Server = NULL;
}
//
// Attempt to open the policy.
//
return( LsaOpenPolicy(
Server,
&ObjectAttributes,
DesiredAccess,
PolicyHandle ) );
}
//+--------------------------------------------------------------------------
//
// Function: InitLsaString
//
// Synopsis: initializes LSA string
//
// Arguments: [LsaString] --
// [String] --
//
// Returns: void
//
// History: September 17, 1998 - created [hueiwang]
//
// Notes:
//
//---------------------------------------------------------------------------
void InitLsaString(PLSA_UNICODE_STRING LsaString,LPWSTR String )
{
DWORD StringLength;
if( NULL == String )
{
LsaString->Buffer = NULL;
LsaString->Length = 0;
LsaString->MaximumLength = 0;
return;
}
StringLength = lstrlenW( String );
LsaString->Buffer = String;
LsaString->Length = ( USHORT ) (StringLength * sizeof( WCHAR ));
LsaString->MaximumLength=( USHORT ) (( StringLength + 1 ) * sizeof( WCHAR ));
}