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.
160 lines
4.1 KiB
160 lines
4.1 KiB
// kernel32.cpp : Defines the initialization routines for the DLL.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include <afxdllx.h>
|
|
#include "..\..\common\rwdll.h"
|
|
#include "..\..\common\rw32hlpr.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
static AFX_EXTENSION_MODULE kernel32DLL = { NULL, NULL };
|
|
|
|
UINT ParseRCData( LPCSTR lpszResId, LPVOID lpImageBuf, DWORD dwISize, LPVOID lpBuffer, DWORD dwSize );
|
|
UINT UpdateRCData( LPVOID lpNewBuf, LONG dwNewSize, LPVOID lpOldI, LONG dwOldImageSize, LPVOID lpNewI, DWORD* pdwNewImageSize );
|
|
|
|
extern char szCaption[MAXSTR];
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// This file implements the RCDATA handling for the file kernel32.dll
|
|
|
|
extern "C"
|
|
DllExport
|
|
UINT
|
|
APIENTRY
|
|
RWParseImageEx(
|
|
LPCSTR lpszType,
|
|
LPCSTR lpszResId,
|
|
LPVOID lpImageBuf,
|
|
DWORD dwImageSize,
|
|
LPVOID lpBuffer,
|
|
DWORD dwSize,
|
|
LPCSTR lpDllName
|
|
)
|
|
{
|
|
UINT uiError = ERROR_NO_ERROR;
|
|
BYTE * lpBuf = (BYTE *)lpBuffer;
|
|
DWORD dwBufSize = dwSize;
|
|
|
|
// The Type we can parse are only the standard ones
|
|
// This function should fill the lpBuffer with an array of ResItem structure
|
|
switch ((UINT)LOWORD(lpszType)) {
|
|
case 10:
|
|
uiError = ParseRCData( lpszResId, lpImageBuf, dwImageSize, lpBuffer, dwSize );
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return uiError;
|
|
}
|
|
|
|
extern "C"
|
|
DllExport
|
|
UINT
|
|
APIENTRY
|
|
RWUpdateImageEx(
|
|
LPCSTR lpszType,
|
|
LPVOID lpNewBuf,
|
|
DWORD dwNewSize,
|
|
LPVOID lpOldImage,
|
|
DWORD dwOldImageSize,
|
|
LPVOID lpNewImage,
|
|
DWORD* pdwNewImageSize,
|
|
LPCSTR lpRCFilename
|
|
)
|
|
{
|
|
UINT uiError = ERROR_NO_ERROR;
|
|
|
|
// The Type we can parse are only the standard ones
|
|
switch ((UINT)LOWORD(lpszType)) {
|
|
case 10:
|
|
uiError = UpdateRCData( lpNewBuf, dwNewSize,
|
|
lpOldImage, dwOldImageSize,
|
|
lpNewImage, pdwNewImageSize );
|
|
break;
|
|
default:
|
|
*pdwNewImageSize = 0L;
|
|
uiError = ERROR_RW_NOTREADY;
|
|
break;
|
|
}
|
|
|
|
return uiError;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Real implementation of the parsers
|
|
|
|
UINT
|
|
ParseRCData( LPCSTR lpszResId, LPVOID lpImageBuf, DWORD dwISize, LPVOID lpBuffer, DWORD dwSize )
|
|
{
|
|
//
|
|
// The data in the RCDATA is just a string null terminated
|
|
//
|
|
LPRESITEM lpResItem = (LPRESITEM)lpBuffer;
|
|
|
|
//
|
|
// Get the string from the image
|
|
//
|
|
GetStringW( (BYTE**)&lpImageBuf, &szCaption[0], (LONG*)&dwISize, MAXSTR );
|
|
LONG dwOverAllSize = sizeof(RESITEM)+strlen(szCaption);
|
|
|
|
if( (LONG)dwSize>dwOverAllSize )
|
|
{
|
|
//
|
|
// Clear the resitem buffer
|
|
//
|
|
memset(lpResItem, '\0', dwSize);
|
|
|
|
lpResItem->dwSize = dwOverAllSize;
|
|
lpResItem->dwItemID = 1;
|
|
lpResItem->dwResID = LOWORD(lpszResId);
|
|
|
|
lpResItem->dwTypeID = 11;
|
|
lpResItem->lpszCaption = strcpy((((char*)lpResItem)+sizeof(RESITEM)), &szCaption[0]);
|
|
}
|
|
|
|
return (UINT)(dwOverAllSize);
|
|
}
|
|
|
|
UINT
|
|
UpdateRCData( LPVOID lpNewBuf, LONG dwNewSize,
|
|
LPVOID lpOldI, LONG dwOldImageSize,
|
|
LPVOID lpNewI, DWORD* pdwNewImageSize )
|
|
{
|
|
UINT uiError = ERROR_NO_ERROR;
|
|
|
|
LPRESITEM lpResItem = (LPRESITEM)lpNewBuf;
|
|
|
|
if(*pdwNewImageSize>strlen(lpResItem->lpszCaption))
|
|
{
|
|
// Write the text
|
|
*pdwNewImageSize = PutStringW( (BYTE **)&lpNewI, lpResItem->lpszCaption, (LONG*)pdwNewImageSize );
|
|
|
|
}
|
|
|
|
return uiError;
|
|
}
|
|
|
|
extern "C" int APIENTRY
|
|
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
|
{
|
|
if (dwReason == DLL_PROCESS_ATTACH)
|
|
{
|
|
TRACE0("RCKERNEL32.DLL Initializing!\n");
|
|
|
|
InitGlobals();
|
|
AfxInitExtensionModule(kernel32DLL, hInstance);
|
|
|
|
new CDynLinkLibrary(kernel32DLL);
|
|
}
|
|
else if (dwReason == DLL_PROCESS_DETACH)
|
|
{
|
|
TRACE0("RCKERNEL32.DLL Terminating!\n");
|
|
}
|
|
return 1;
|
|
}
|