|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
umfuncs.c
Abstract:
Help functions to map file into memory
Environment:
Windows NT printer drivers
Revision History:
08/13/96 -davidx- Created it.
--*/
#include "lib.h"
#if defined(KERNEL_MODE) && !defined(USERMODE_DRIVER)
HFILEMAP MapFileIntoMemory( IN LPCTSTR ptstrFilename, OUT PVOID *ppvData, OUT PDWORD pdwSize )
/*++
Routine Description:
Map a file into process memory space.
Arguments:
ptstrFilename - Specifies the name of the file to be mapped ppvData - Points to a variable for returning mapped memory address pdwSize - Points to a variable for returning the size of the file
Return Value:
Handle to identify the mapped file, NULL if there is an error
--*/
{ HANDLE hModule = NULL; DWORD dwSize;
if (hModule = EngLoadModule((PWSTR) ptstrFilename)) { if (*ppvData = EngMapModule(hModule, &dwSize)) { if (pdwSize) *pdwSize = dwSize; } else { TERSE(("EngMapModule failed: %d\n", GetLastError())); EngFreeModule(hModule); hModule = NULL; } } else ERR(("EngLoadModule failed: %d\n", GetLastError()));
return (HFILEMAP) hModule; }
VOID UnmapFileFromMemory( IN HFILEMAP hFileMap )
/*++
Routine Description:
Unmap a file from memory
Arguments:
hFileMap - Identifies a file previously mapped into memory
Return Value:
NONE
--*/
{ ASSERT(hFileMap != NULL); EngFreeModule((HANDLE) hFileMap); }
#else // !KERNEL_MODE
HFILEMAP MapFileIntoMemory( IN LPCTSTR ptstrFilename, OUT PVOID *ppvData, OUT PDWORD pdwSize )
/*++
Routine Description:
Map a file into process memory space.
Arguments:
ptstrFilename - Specifies the name of the file to be mapped ppvData - Points to a variable for returning mapped memory address pdwSize - Points to a variable for returning the size of the file
Return Value:
Handle to identify the mapped file, NULL if there is an error
--*/
{ HANDLE hFile, hFileMap;
//
// Open a handle to the specified file
//
hFile = CreateFile(ptstrFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS, NULL);
if (hFile == INVALID_HANDLE_VALUE) { TERSE(("CreateFile failed: %d\n", GetLastError())); return NULL; }
//
// Obtain the file size if requested
//
if (pdwSize != NULL) { *pdwSize = GetFileSize(hFile, NULL);
if (*pdwSize == 0xFFFFFFFF) { ERR(("GetFileSize failed: %d\n", GetLastError())); CloseHandle(hFile); return NULL; } }
//
// Map the file into memory
//
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMap != NULL) { *ppvData = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); CloseHandle(hFileMap); } else { ERR(("CreateFileMapping failed: %d\n", GetLastError())); *ppvData = NULL; }
//
// We can safely close both the file mapping object and the file object itself.
//
CloseHandle(hFile);
//
// The identifier for the mapped file is simply the starting memory address.
//
return (HFILEMAP) *ppvData; }
VOID UnmapFileFromMemory( IN HFILEMAP hFileMap )
/*++
Routine Description:
Unmap a file from memory
Arguments:
hFileMap - Identifies a file previously mapped into memory
Return Value:
NONE
--*/
{ ASSERT(hFileMap != NULL); UnmapViewOfFile((PVOID) hFileMap); }
#endif // !KERNEL_MODE
|