mirror of https://github.com/tongzx/nt5src
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.
135 lines
3.2 KiB
135 lines
3.2 KiB
/*****************************************************************************************************************
|
|
|
|
FILE: LoadFile.cpp
|
|
|
|
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
|
|
|
|
FUNCTION:
|
|
This module reads the specified file from the disk and loads it into memory returning
|
|
a handle to the memory
|
|
|
|
INPUT + OUTPUT:
|
|
IN cFileName - is a valid file name
|
|
IN pdwFileSize - specifies how many bytes to read - if zero then the size of the memory
|
|
is checked and this value is calculated
|
|
IN dwSharing - is the DWORD to pass to CreateFile about file sharing
|
|
IN dwCreate - is the DWORD to pass to CreateFile about file creation
|
|
|
|
GLOBALS:
|
|
None.
|
|
|
|
RETURN:
|
|
Valid handle to the memory which holds the specified file
|
|
NULL if not succesful
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include <windows.h>
|
|
#include "ErrMacro.h"
|
|
|
|
|
|
HANDLE
|
|
LoadFile(
|
|
IN PTCHAR cLoadFileName,
|
|
IN PDWORD pdwFileSize,
|
|
IN DWORD dwSharing,
|
|
IN DWORD dwCreate
|
|
)
|
|
{
|
|
HANDLE hFileHandle = INVALID_HANDLE_VALUE; // File handle
|
|
DWORD dwFileSizeHi; // Hi word of file size
|
|
DWORD dwFileSizeLo = 0xFFFFFFFF; // Lo word of file size and initialize
|
|
DWORD dwReadTotal = 0; // Total bytes read during ReadFile
|
|
HANDLE hMemory = NULL; // Memory handle
|
|
LPVOID pMemory = NULL; // Memory pointer
|
|
DWORD dwLastError = 0;
|
|
BOOL bReturn = FALSE;
|
|
|
|
__try{
|
|
|
|
// Get the file handle.
|
|
if((hFileHandle = CreateFile(cLoadFileName,
|
|
0,
|
|
dwSharing,
|
|
NULL,
|
|
dwCreate,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL)) == INVALID_HANDLE_VALUE) {
|
|
|
|
// No error handling here! The calling function may wish
|
|
// to handle different situations in different ways. Save the error.
|
|
dwLastError = GetLastError();
|
|
__leave;
|
|
}
|
|
|
|
// Get the file size.
|
|
if (*pdwFileSize != 0) {
|
|
dwFileSizeLo = *pdwFileSize;
|
|
}
|
|
else{
|
|
// File size not passed in so calculate it
|
|
dwFileSizeLo = GetFileSize(hFileHandle,&dwFileSizeHi);
|
|
if (dwFileSizeLo == 0xFFFFFFFF){
|
|
EH_ASSERT(FALSE);
|
|
__leave;
|
|
}
|
|
}
|
|
// Set the file size to the actual size of the file for the calling function.
|
|
*pdwFileSize = dwFileSizeLo;
|
|
|
|
// Return a NULL pointer if the file size is 0.
|
|
if(dwFileSizeLo == 0){
|
|
__leave;
|
|
}
|
|
|
|
// Allocate memory for the file.
|
|
hMemory = GlobalAlloc(GHND, dwFileSizeLo);
|
|
|
|
if (!hMemory){
|
|
EH_ASSERT(FALSE);
|
|
__leave;
|
|
}
|
|
|
|
// Lock the memory and get pointer to the memory.
|
|
pMemory = GlobalLock(hMemory);
|
|
if (!pMemory){
|
|
EH_ASSERT(FALSE);
|
|
__leave;
|
|
}
|
|
|
|
// Read the file into memory.
|
|
if (!ReadFile(hFileHandle, pMemory, dwFileSizeLo, &dwReadTotal,0)){
|
|
__leave;
|
|
}
|
|
|
|
bReturn = TRUE; // all is ok
|
|
}
|
|
|
|
__finally {
|
|
|
|
// Close the file handle.
|
|
if(hFileHandle != INVALID_HANDLE_VALUE){
|
|
CloseHandle(hFileHandle);
|
|
}
|
|
|
|
// Success so unlock the memory and return the memory handle.
|
|
if(bReturn) {
|
|
GlobalUnlock(hMemory);
|
|
}
|
|
else { // had an error
|
|
// So cleanup and return NULL.
|
|
if(hMemory){
|
|
EH_ASSERT(GlobalUnlock(hMemory) == FALSE);
|
|
EH_ASSERT(GlobalFree(hMemory) == NULL);
|
|
hMemory = NULL;
|
|
}
|
|
|
|
// Recover the error if any since another API may have cleared it.
|
|
if(dwLastError){
|
|
SetLastError(dwLastError);
|
|
}
|
|
}
|
|
}
|
|
|
|
return hMemory;
|
|
}
|