Leaked source code of windows server 2003
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.
 
 
 
 
 
 

131 lines
3.4 KiB

#include "pch.h"
#pragma pack(push, 2)
typedef struct tagDLGTEMPLATEEX {
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
} DLGTEMPLATEEX, *PDLGTEMPLATEEX;
typedef const DLGTEMPLATEEX* PCDLGTEMPLATEEX;
#pragma pack(pop)
BOOL loadDialogTemplate (HINSTANCE hinstDlg, UINT nID, PVOID *ppvDT, PDWORD pcbDT);
HRESULT PrepareDlgTemplate(HINSTANCE hInst, UINT nDlgID, DWORD dwStyle, PVOID *ppvDT)
{
PCDLGTEMPLATEEX pdt2;
LPCDLGTEMPLATE pdt; // for some weird reason there is no PCDLGTEMPLATE
PVOID pvDlg;
HRESULT hr;
DWORD cbDlg;
BOOL fResult;
//----- Initialization and parameter validation -----
if (hInst == NULL || nDlgID == 0)
return E_INVALIDARG;
if (ppvDT == NULL)
return E_POINTER;
*ppvDT = NULL;
//----- Resource allocation -----
fResult = loadDialogTemplate(hInst, nDlgID, &pvDlg, &cbDlg);
if (!fResult)
return E_FAIL;
*ppvDT = CoTaskMemAlloc(cbDlg);
if (*ppvDT == NULL)
return E_OUTOFMEMORY;
ZeroMemory(*ppvDT, cbDlg);
CopyMemory(*ppvDT, pvDlg, cbDlg);
hr = S_OK;
//----- Parse through Dialog Template -----
UINT nStyleOffset;
pdt = NULL;
pdt2 = (PCDLGTEMPLATEEX)pvDlg; // assume extended style
if (pdt2->signature == 0xFFFF) {
if (pdt2->dlgVer != 1)
return E_UNEXPECTED; // Chicago sanity check
nStyleOffset = (UINT) ((PBYTE)&pdt2->style - (PBYTE)pdt2);
}
else {
pdt = (LPCDLGTEMPLATE)pvDlg;
pdt2 = NULL;
nStyleOffset = (UINT) ((PBYTE)&pdt->style - (PBYTE)pdt);
}
// let party on it now, style is DWORD
// BUGBUG: (andrewgu) the code below regarding to styles was figured out by experement. if you
// can't understand it just believe in it and pray that it works. the idea is to preserve
// extended style bits from the old style if new style doesn't have any. on the other hand, if
// the new style has extended bits in it, i assume the caller knows what he's doing and i let
// it through.
PDWORD pdwOldStyle;
DWORD dwNewStyle;
pdwOldStyle = (PDWORD)((PBYTE)*ppvDT + nStyleOffset);
dwNewStyle = dwStyle;
if (dwNewStyle == 0)
dwNewStyle = WS_CHILD | DS_CONTROL;
if ((dwNewStyle & 0x0000FFFF) == 0)
dwNewStyle |= *pdwOldStyle & 0x0000FFFF;
*pdwOldStyle = dwNewStyle;
return hr;
}
/////////////////////////////////////////////////////////////////////////////
// Implementation helpers routines (private)
BOOL loadDialogTemplate(HINSTANCE hinstDlg, UINT nID, PVOID *ppvDT, PDWORD pcbDT)
{
PVOID p;
HANDLE h;
if (hinstDlg == NULL)
return FALSE;
if (ppvDT == NULL)
return FALSE;
*ppvDT = NULL;
if (pcbDT == NULL)
return FALSE;
*pcbDT = 0;
h = FindResource(hinstDlg, MAKEINTRESOURCE(nID), RT_DIALOG);
if (h == NULL)
return FALSE;
*pcbDT = SizeofResource(hinstDlg, (HRSRC)h);
if (*pcbDT == 0)
return FALSE;
h = LoadResource(hinstDlg, (HRSRC)h);
if (h == NULL)
return FALSE;
p = LockResource(h);
if (p == NULL)
return FALSE;
*ppvDT = p;
return TRUE;
}