Leaked source code of windows server 2003
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.
 
 
 
 
 
 

149 lines
4.6 KiB

//+-------------------------------------------------------------------------
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 2001 - 2001
//
// File: fileutil.cpp
//
// Contents: File utility functions used by the minimal cryptographic
// APIs.
//
// Functions: I_MinCryptMapFile
//
// History: 21-Jan-01 philh created
//--------------------------------------------------------------------------
#include "global.hxx"
#define I_CreateFileU CreateFileW
//+-------------------------------------------------------------------------
// Maps the file into memory.
//
// According to dwFileType, pvFile can be a pwszFilename, hFile or pFileBlob.
// Only READ access is required.
//
// dwFileType:
// MINCRYPT_FILE_NAME : pvFile - LPCWSTR pwszFilename
// MINCRYPT_FILE_HANDLE : pvFile - HANDLE hFile
// MINCRYPT_FILE_BLOB : pvFile - PCRYPT_DATA_BLOB pFileBlob
//
// *pFileBlob is updated with pointer to and length of the mapped file. For
// MINCRYPT_FILE_NAME and MINCRYPT_FILE_HANDLE, UnmapViewOfFile() must
// be called to free pFileBlob->pbData.
//
// All accesses to this mapped memory must be within __try / __except's.
//--------------------------------------------------------------------------
LONG
WINAPI
I_MinCryptMapFile(
IN DWORD dwFileType,
IN const VOID *pvFile,
OUT PCRYPT_DATA_BLOB pFileBlob
)
{
LONG lErr = ERROR_SUCCESS;
switch (dwFileType) {
case MINCRYPT_FILE_NAME:
{
LPCWSTR pwszInFilename = (LPCWSTR) pvFile;
HANDLE hFile;
hFile = I_CreateFileU(
pwszInFilename,
GENERIC_READ,
FILE_SHARE_READ,
NULL, // lpsa
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL // hTemplateFile
);
if (INVALID_HANDLE_VALUE == hFile)
goto CreateFileError;
lErr = I_MinCryptMapFile(
MINCRYPT_FILE_HANDLE,
(const VOID *) hFile,
pFileBlob
);
CloseHandle(hFile);
}
break;
case MINCRYPT_FILE_HANDLE:
{
HANDLE hInFile = (HANDLE) pvFile;
HANDLE hMappedFile;
DWORD cbHighSize = 0;;
DWORD cbLowSize;
cbLowSize = GetFileSize(hInFile, &cbHighSize);
if (INVALID_FILE_SIZE == cbLowSize)
goto GetFileSizeError;
if (0 != cbHighSize)
goto Exceeded32BitFileSize;
hMappedFile = CreateFileMappingA(
hInFile,
NULL, // lpFileMappingAttributes,
PAGE_READONLY,
0, // dwMaximumSizeHigh
0, // dwMaximumSizeLow
NULL // lpName
);
if (NULL == hMappedFile)
goto CreateFileMappingError;
pFileBlob->pbData = (BYTE *) MapViewOfFile(
hMappedFile,
FILE_MAP_READ,
0, // dwFileOffsetHigh
0, // dwFileOffsetLow
0 // dwNumberOfBytesToMap, 0 => entire file
);
CloseHandle(hMappedFile);
if (NULL == pFileBlob->pbData)
goto MapViewOfFileError;
pFileBlob->cbData = cbLowSize;
}
break;
case MINCRYPT_FILE_BLOB:
{
PCRYPT_DATA_BLOB pInFileBlob = (PCRYPT_DATA_BLOB) pvFile;
*pFileBlob = *pInFileBlob;
}
break;
default:
goto InvalidParameter;
}
CommonReturn:
return lErr;
ErrorReturn:
assert(ERROR_SUCCESS != lErr);
pFileBlob->pbData = NULL;
pFileBlob->cbData = 0;
goto CommonReturn;
InvalidParameter:
lErr = ERROR_INVALID_PARAMETER;
goto ErrorReturn;
Exceeded32BitFileSize:
lErr = ERROR_FILE_INVALID;
goto ErrorReturn;
CreateFileError:
GetFileSizeError:
CreateFileMappingError:
MapViewOfFileError:
lErr = GetLastError();
if (ERROR_SUCCESS == lErr)
lErr = ERROR_OPEN_FAILED;
goto ErrorReturn;
}