172 lines
4.6 KiB
C++
172 lines
4.6 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: fileguid.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
#include "sgnerror.h"
|
|
|
|
//+-----------------------------------------------------------------------
|
|
// SignGetFileType
|
|
//
|
|
// Parameters:
|
|
// Return Values:
|
|
// Error Codes:
|
|
// E_INVALIDARG
|
|
// Invalid arguement passed in (Requires a file name
|
|
// and pointer to a guid ptr)
|
|
// See also:
|
|
// GetFileInformationByHandle()
|
|
// CreateFile()
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
HRESULT SignGetFileType(HANDLE hFile,
|
|
const WCHAR *pwszFile,
|
|
GUID* pGuid)
|
|
// Answer as to the type as which we should sign this file
|
|
{
|
|
if (!(pGuid) || !(hFile) || (hFile == INVALID_HANDLE_VALUE))
|
|
{
|
|
return(E_INVALIDARG);
|
|
}
|
|
|
|
if (!(CryptSIPRetrieveSubjectGuid(pwszFile, hFile, pGuid)))
|
|
{
|
|
return(GetLastError());
|
|
}
|
|
|
|
return(S_OK);
|
|
|
|
# ifdef PCB_OLD
|
|
// Java class files have a magic number at their start. They always begin
|
|
// 0xCA 0xFE 0xBA 0xBE
|
|
// CAB files begin 'M' 'S' 'C' 'F'
|
|
//
|
|
|
|
if(!pGuid || hFile == NULL || hFile == INVALID_HANDLE_VALUE)
|
|
return E_INVALIDARG;
|
|
|
|
ZeroMemory(pGuid, sizeof(GUID));
|
|
PKITRY {
|
|
static BYTE rgbMagicJava[] = { 0xCA, 0xFE, 0xBA, 0xBE };
|
|
static BYTE rgbMagicCab [] = { 'M', 'S', 'C', 'F' };
|
|
BYTE rgbRead[4];
|
|
DWORD dwRead;
|
|
|
|
if (ReadFile(hFile, rgbRead, 4, &dwRead, NULL) &&
|
|
dwRead == 4) {
|
|
if (memcmp(rgbRead, rgbMagicJava, 4)==0)
|
|
*pGuid = JavaImage;
|
|
else if (memcmp(rgbRead, rgbMagicCab, 4)==0)
|
|
*pGuid = CabImage;
|
|
else
|
|
*pGuid = PeImage;
|
|
}
|
|
|
|
|
|
// Rewind the file
|
|
if(SetFilePointer(hFile, 0, 0, FILE_BEGIN) == 0xffffffff)
|
|
PKITHROW(SignError());
|
|
|
|
}
|
|
PKICATCH(err) {
|
|
hr = err.pkiError;
|
|
} PKIEND;
|
|
|
|
return hr;
|
|
# endif // PCB_OLD
|
|
}
|
|
|
|
//Xiaohs: the following function is no longer necessary after auth2upd
|
|
/*HRESULT SignLoadSipFlags(GUID* pSubjectGuid,
|
|
DWORD *dwFlags)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
GUID sSip;
|
|
if(!dwFlags)
|
|
return E_INVALIDARG;
|
|
|
|
if (dwFlags)
|
|
{
|
|
*dwFlags = 0;
|
|
sSip = PeImage;
|
|
if(memcmp(&sSip, pSubjectGuid, sizeof(GUID)) == 0)
|
|
{
|
|
*dwFlags = SPC_INC_PE_RESOURCES_FLAG | SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG;
|
|
return hr;
|
|
}
|
|
}
|
|
return hr;
|
|
} */
|
|
|
|
|
|
//+-----------------------------------------------------------------------
|
|
// FileToSubjectType
|
|
//
|
|
// Parameters:
|
|
// Return Values:
|
|
// Error Codes:
|
|
// E_INVALIDARG
|
|
// Invalid arguement passed in (Requires a file name
|
|
// and pointer to a guid ptr)
|
|
// TRUST_E_SUBJECT_FORM_UNKNOWN
|
|
// Unknow file type
|
|
// See also:
|
|
// GetFileInformationByHandle()
|
|
// CreateFile()
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
HRESULT SignOpenFile(LPCWSTR pwszFilename,
|
|
HANDLE* pFileHandle)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HANDLE hFile = NULL;
|
|
BY_HANDLE_FILE_INFORMATION hFileInfo;
|
|
|
|
if(!pwszFilename || !pFileHandle)
|
|
return E_INVALIDARG;
|
|
|
|
PKITRY {
|
|
hFile = CreateFileU(pwszFilename,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ,
|
|
NULL, // lpsa
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL); // hTemplateFile
|
|
|
|
if(INVALID_HANDLE_VALUE == hFile)
|
|
PKITHROW(SignError());
|
|
|
|
if(!GetFileInformationByHandle(hFile,
|
|
&hFileInfo))
|
|
PKITHROW(SignError());
|
|
|
|
// Test to see if we have a directory or offline
|
|
if( (hFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
|
|
(hFileInfo.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) )
|
|
{
|
|
PKITHROW(TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
}
|
|
}
|
|
PKICATCH(err) {
|
|
hr = err.pkiError;
|
|
CloseHandle(hFile);
|
|
hFile = NULL;
|
|
} PKIEND;
|
|
|
|
*pFileHandle = hFile;
|
|
return hr;
|
|
}
|
|
|
|
|