|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
kmfuncs.c
Abstract:
Kernel-mode specific library functions
Environment:
Windows NT printer drivers
Revision History:
10/19/97 -fengy- added MapFileIntoMemoryForWrite, GenerateTempFileName.
03/16/96 -davidx- Created it.
mm/dd/yy -author- description
--*/
#ifndef USERMODE_DRIVER
#include "lib.h"
//
// Maximum number of time to try to generate a unique name
//
#define MAX_UNIQUE_NAME_TRY 9
HANDLE MapFileIntoMemoryForWrite( IN LPCTSTR ptstrFilename, IN DWORD dwDesiredSize, OUT PVOID *ppvData, OUT PDWORD pdwSize )
/*++
Routine Description:
Map a file into process memory space for write.
Arguments:
ptstrFilename - Specifies the name of the file to be mapped dwDesiredSize - Specifies the desired size of the file to be mapped ppvData - Points to a variable for returning mapped memory address pdwSize - Points to a variable for returning the actual size of the mapped file
Return Value:
Handle to identify the mapped file, NULL if there is an error
--*/
{ HANDLE hModule = NULL; DWORD dwSize;
if (hModule = EngLoadModuleForWrite((PWSTR)ptstrFilename, dwDesiredSize)) { if (*ppvData = EngMapModule(hModule, &dwSize)) { if (pdwSize) *pdwSize = dwSize; } else { ERR(("EngMapModule failed: %d\n", GetLastError())); EngFreeModule(hModule); hModule = NULL; } } else ERR(("EngLoadModuleForWrite failed: %d\n", GetLastError()));
return hModule; }
PTSTR GenerateTempFileName( IN LPCTSTR lpszPath, IN DWORD dwSeed )
/*++
Routine Description:
Generate a temporary filename in kernel mode.
Arguments:
lpszPath - A null-terminated string which specifies the path of the temp file. It should contain the trailing backslash. dwSeed - a number used to generate unique file name
Return Value:
Pointer to a null-terminated full path filename string, NULL if there is an error. Caller is responsible for freeing the returned string.
--*/
{ ENG_TIME_FIELDS currentTime; ULONG ulNameValue,ulExtValue; PTSTR ptstr,tempName[36],tempStr[16]; INT iPathLength,iNameLength,i; HFILEMAP hFileMap; PVOID pvData; DWORD dwSize; BOOL bNameUnique=FALSE; INT iTry=0;
ASSERT(lpszPath != NULL);
while (!bNameUnique && iTry < MAX_UNIQUE_NAME_TRY) { EngQueryLocalTime(¤tTime);
//
// Use the seed number and current local time to compose the temporary file name
//
ulNameValue = currentTime.usDay * 1000000 + currentTime.usHour * 10000 + currentTime.usMinute * 100 + currentTime.usSecond; ulExtValue = currentTime.usMilliseconds;
_ultot((ULONG)dwSeed, (PTSTR)tempName, 10); _tcsncat((PTSTR)tempName, TEXT("_"), 1);
_ultot(ulNameValue, (PTSTR)tempStr, 10); _tcsncat((PTSTR)tempName, (PTSTR)tempStr, _tcslen((PTSTR)tempStr)); _tcsncat((PTSTR)tempName, TEXT("."), 1);
_ultot(ulExtValue, (PTSTR)tempStr, 10); _tcsncat((PTSTR)tempName, (PTSTR)tempStr, _tcslen((PTSTR)tempStr));
iPathLength = _tcslen(lpszPath); iNameLength = _tcslen((PTSTR)tempName);
if ((ptstr = MemAlloc((iPathLength + iNameLength + 1) * sizeof(TCHAR))) != NULL) { CopyMemory(ptstr, lpszPath, iPathLength * sizeof(TCHAR)); CopyMemory(ptstr+iPathLength, (PTSTR)tempName, (iNameLength+1) * sizeof(TCHAR));
//
// Verify if a file with the same name already exists
//
if (!(hFileMap = MapFileIntoMemory(ptstr, &pvData, &dwSize))) bNameUnique = TRUE; else { //
// Need to generate another temporary file name
//
UnmapFileFromMemory(hFileMap); MemFree(ptstr); ptstr = NULL; iTry++; } } else { ERR(("Memory allocation failed\n")); SetLastError(ERROR_NOT_ENOUGH_MEMORY); break; } }
return ptstr; }
#if DBG
//
// Functions for outputting debug messages
//
VOID DbgPrint( IN PCSTR pstrFormat, ... )
{ va_list ap;
va_start(ap, pstrFormat); EngDebugPrint("", (PCHAR) pstrFormat, ap); va_end(ap); }
#endif
#endif //!USERMODE_DRIVER
|