Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

174 lines
3.2 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
kmfuncs.c
Abstract:
Kernel mode functions
[Environment:]
Win32 subsystem, PostScript driver, kernel mode
[Notes:]
Revision History:
06/15/95 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "pslib.h"
INT
LOADSTRING(
HANDLE hinst,
UINT id,
PWSTR pwstr,
INT bufsize
)
/*++
Routine Description:
Loads a string resource from the resource file associated with a
specified module, copies the string into a buffer, and appends a
terminating null character.
Arguments:
hinst handle to the module containing the string resource
id ID of the string to be loaded
pwstr points to the buffer to receive the string
bufsize size of the buffer, in characters.
Return Value:
Return value is the number of characters copied into the buffer, not
including the null-terminating character.
--*/
#define WINRT_STRING 6 // string resource type
{
PWSTR pwstrBuffer;
ULONG size;
// String Tables are broken up into 16 string segments.
// Find the segment containing the string we are interested in.
pwstrBuffer = EngFindResource(hinst, (id>>4)+1, WINRT_STRING, &size);
if (pwstrBuffer == NULL ) {
DBGMSG(DBG_LEVEL_ERROR, "EngFindResource failed.\n");
bufsize = 0;
} else {
PWSTR pwstrEnd = pwstrBuffer + size / sizeof(WCHAR);
INT length;
// Move past the other strings in this segment.
id &= 0x0F;
while (pwstrBuffer < pwstrEnd) {
// PASCAL style string - first char is length
length = *pwstrBuffer++;
if(id-- == 0 ) {
break;
}
pwstrBuffer += length;
}
if (pwstrBuffer < pwstrEnd) {
// Truncate the string if it's longer than max buffer size
if (--bufsize > length)
bufsize = length;
memcpy(pwstr, pwstrBuffer, bufsize*sizeof(WCHAR));
} else {
DBGMSG(DBG_LEVEL_ERROR, "Bad string resource.\n");
bufsize = 0;
}
}
pwstr[bufsize] = L'\0';
return bufsize;
}
BOOL
MAPFILE(
PCWSTR pwstrFilename,
HANDLE *phModule,
PBYTE *ppData,
DWORD *pSize
)
/*++
Routine Description:
Map a file into process memory space.
Arguments:
pwstrFilename pointer to Unicode filename
phModule pointer to a variable for return module handle
ppData pointer to a variable for returning mapped memory address
pSize pointer to a variable for returning file size
Return Value:
TRUE if the file was successfully mapped. FALSE otherwise.
[Note:]
Use FREEMODULE(hmodule) to unmap the file when you're done.
--*/
{
DWORD dwSize;
if ((*phModule = EngLoadModule((PWSTR) pwstrFilename)) == NULL) {
DBGERRMSG("EngLoadModule");
return FALSE;
}
if ((*ppData = EngMapModule(*phModule, &dwSize)) == NULL) {
DBGERRMSG("EngMapModule");
FREEMODULE(*phModule);
return FALSE;
}
if (pSize != NULL)
{
*pSize = dwSize;
}
return TRUE;
}