windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkisign/mssign32/fileguid.cpp
2020-09-26 16:20:57 +08:00

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;
}