179 lines
3.4 KiB
C
179 lines
3.4 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
util.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the following private utility routines for the Plug and
|
|||
|
Play registry merge-restore routines:
|
|||
|
|
|||
|
FileExists
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Cavalaris (jamesca) 2-10-2000
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User-mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
10-February-2000 jamesca
|
|||
|
|
|||
|
Creation and initial implementation.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// includes
|
|||
|
//
|
|||
|
#include "precomp.h"
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// definitions
|
|||
|
//
|
|||
|
#define MAX_GUID_STRING_LEN 39 // 38 chars + terminating NULL
|
|||
|
|
|||
|
//
|
|||
|
// Declare data used in GUID->string conversion (from ole32\common\ccompapi.cxx).
|
|||
|
//
|
|||
|
|
|||
|
static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
|
|||
|
8, 9, '-', 10, 11, 12, 13, 14, 15 };
|
|||
|
|
|||
|
static const TCHAR szDigits[] = TEXT("0123456789ABCDEF");
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// routines
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
pSifUtilFileExists(
|
|||
|
IN PCTSTR FileName,
|
|||
|
OUT PWIN32_FIND_DATA FindData OPTIONAL
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Determine if a file exists and is accessible.
|
|||
|
Errormode is set (and then restored) so the user will not see
|
|||
|
any pop-ups.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
FileName - supplies full path of file to check for existance.
|
|||
|
|
|||
|
FindData - if specified, receives find data for the file.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if the file exists and is accessible.
|
|||
|
FALSE if not. GetLastError() returns extended error info.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
WIN32_FIND_DATA findData;
|
|||
|
HANDLE FindHandle;
|
|||
|
UINT OldMode;
|
|||
|
DWORD Error;
|
|||
|
|
|||
|
OldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|||
|
|
|||
|
FindHandle = FindFirstFile(FileName,&findData);
|
|||
|
if(FindHandle == INVALID_HANDLE_VALUE) {
|
|||
|
Error = GetLastError();
|
|||
|
} else {
|
|||
|
FindClose(FindHandle);
|
|||
|
if(FindData) {
|
|||
|
*FindData = findData;
|
|||
|
}
|
|||
|
Error = NO_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
SetErrorMode(OldMode);
|
|||
|
|
|||
|
SetLastError(Error);
|
|||
|
return (Error == NO_ERROR);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
pSifUtilStringFromGuid(
|
|||
|
IN CONST GUID *Guid,
|
|||
|
OUT PTSTR GuidString,
|
|||
|
IN DWORD GuidStringSize
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine converts a GUID into a null-terminated string which represents
|
|||
|
it. This string is of the form:
|
|||
|
|
|||
|
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
|
|||
|
|
|||
|
where x represents a hexadecimal digit.
|
|||
|
|
|||
|
This routine comes from ole32\common\ccompapi.cxx. It is included here to avoid linking
|
|||
|
to ole32.dll. (The RPC version allocates memory, so it was avoided as well.)
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Guid - Supplies a pointer to the GUID whose string representation is
|
|||
|
to be retrieved.
|
|||
|
|
|||
|
GuidString - Supplies a pointer to character buffer that receives the
|
|||
|
string. This buffer must be _at least_ 39 (MAX_GUID_STRING_LEN) characters
|
|||
|
long.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Returns TRUE if successful, FALSE if not.
|
|||
|
GetLastError() returns extended error info.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
CONST BYTE *GuidBytes;
|
|||
|
INT i;
|
|||
|
|
|||
|
if(GuidStringSize < MAX_GUID_STRING_LEN) {
|
|||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
GuidBytes = (CONST BYTE *)Guid;
|
|||
|
|
|||
|
*GuidString++ = TEXT('{');
|
|||
|
|
|||
|
for(i = 0; i < sizeof(GuidMap); i++) {
|
|||
|
|
|||
|
if(GuidMap[i] == '-') {
|
|||
|
*GuidString++ = TEXT('-');
|
|||
|
} else {
|
|||
|
*GuidString++ = szDigits[ (GuidBytes[GuidMap[i]] & 0xF0) >> 4 ];
|
|||
|
*GuidString++ = szDigits[ (GuidBytes[GuidMap[i]] & 0x0F) ];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
*GuidString++ = TEXT('}');
|
|||
|
*GuidString = TEXT('\0');
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|