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.
 
 
 
 
 
 

188 lines
6.9 KiB

#include <cpl.h>
#include "shell32p.h"
#ifndef _WCOMMOBJ_H_
#include "wcommobj.h"
#endif
extern TCHAR const c_szCPLCache[];
extern TCHAR const c_szCPLData[];
// Structures used to enumerate CPLs.
//
typedef struct tagControlData
{
HDSA haminst; // MINST for each loaded dll
HDSA hamiModule; // Array of MODULEINFOs of modules in system
int cModules; // size of hamiModule
LPBYTE pRegCPLBuffer; // Buffer for hRegCPLs (read from registry)
HDPA hRegCPLs; // Array of RegCPLInfo structs from registry
int cRegCPLs; // size of hRegCPLs
BOOL fRegCPLChanged; // TRUE iff hRegCPLs changed
} ControlData, *PControlData;
typedef struct tagModuleInfo
{
LPTSTR pszModule; // Name of .cpl module
LPTSTR pszModuleName; // points into pszModule to the name sans path
BOOL flags; // MI_ flags defined below
FILETIME ftCreationTime;// WIN32_FIND_DATA.ftCreationTime
DWORD nFileSizeHigh; // WIN32_FIND_DATA.nFileSizeHigh
DWORD nFileSizeLow; // WIN32_FIND_DATA.nFileSizeLow
} MODULEINFO, *PMODULEINFO;
// flags:
#define MI_FIND_FILE 1 // WIN32_FIND_FILE info filled in
#define MI_REG_ENUM 2 // Module already enumerated thru registry
#define MI_CPL_LOADED 4 // CPLD_InitModule called for this module
typedef struct tagRegCPLInfo
{
UINT cbSize; // We write the first cbSize bytes of this
// structure to the registry. This saves about
// 250 bytes per structure in the registry.
BOOL flags;
// what file does this CPL come from?
// UINT oFileName; // file name // always 0, so don't need it
FILETIME ftCreationTime;// WIN32_FIND_DATA.ftCreationTime
DWORD nFileSizeHigh; // WIN32_FIND_DATA.nFileSizeHigh
DWORD nFileSizeLow; // WIN32_FIND_DATA.nFileSizeLow
// what's the display info for this CPL?
int idIcon;
UINT oName; // (icon title) short name
UINT oInfo; // (details view) description
// buffer for information
TCHAR buf[MAX_PATH + // oFileName
32 + // oName
64]; // oInfo
} RegCPLInfo;
typedef RegCPLInfo * PRegCPLInfo;
// flags:
#define REGCPL_FROMREG 0x0001 // this RegCPLInfo was loaded from the registry
// (used to optimize reading from registry)
// helper defines:
#define REGCPL_FILENAME(pRegCPLInfo) ((pRegCPLInfo)->buf)
#define REGCPL_CPLNAME(pRegCPLInfo) (&((pRegCPLInfo)->buf[(pRegCPLInfo)->oName]))
#define REGCPL_CPLINFO(pRegCPLInfo) (&((pRegCPLInfo)->buf[(pRegCPLInfo)->oInfo]))
// Information about control modules and individual controls
//
typedef struct // cpli
{
int idControl; // control index
HICON hIcon; // handle of icon
int idIcon; // ID of the icon (used for links)
LPTSTR pszName; // ptr to name string
LPTSTR pszInfo; // ptr to info string
LPTSTR pszHelpFile; // help file
LONG lData; // user supplied data
DWORD dwContext; // help context
} CPLITEM, *LPCPLITEM;
typedef struct // minst
{
BOOL fIs16bit;
HINSTANCE hinst; // either a 16 or 32 bit HINSTANCE (fIs16bit)
DWORD idOwner; // process id of owner (system unique)
HANDLE hOwner; // keeps id valid (against reuse)
} MINST;
typedef struct // cplm
{
int cRef;
MINST minst;
TCHAR szModule[MAXPATHLEN];
union
{
FARPROC16 lpfnCPL16; // minst.fIs16bit=TRUE
APPLET_PROC lpfnCPL32; // minst.fIs16bit=FALSE
FARPROC lpfnCPL; // for opaque operation
};
HDSA hacpli; // array of CPLITEM structs
} CPLMODULE, *PCPLMODULE, *LPCPLMODULE;
// our pidc type:
typedef struct _IDCONTROLA
{
USHORT cb;
int idIcon;
USHORT oName; // cBuf[oName] is start of NAME
USHORT oInfo; // cBuf[oInfo] is start of DESCRIPTION
CHAR cBuf[MAX_PATH*2]; // cBuf[0] is the start of FILENAME
USHORT uTerm;
} IDCONTROLA;
typedef UNALIGNED struct _IDCONTROLA *LPIDCONTROLA;
typedef struct _IDCONTROLW
{
USHORT cb;
int idIcon;
USHORT oName; // if Unicode .cpl, this will be 0
USHORT oInfo; // if Unicode .cpl, this will be 0
CHAR cBuf[2]; // if Unicode .cpl, cBuf[0] = '\0', cBuf[1] = magic byte
DWORD dwFlags; // Unused; for future expansion
USHORT oNameW; // cBufW[oNameW] is start of NAME
USHORT oInfoW; // cBufW[oInfoW] is start of DESCRIPTION
WCHAR cBufW[MAX_PATH*2]; // cBufW[0] is the start of FILENAME
} IDCONTROLW;
typedef UNALIGNED struct _IDCONTROLW *LPIDCONTROLW;
#ifdef UNICODE
#define IDCONTROL IDCONTROLW
#define LPIDCONTROL LPIDCONTROLW
#else
#define IDCONTROL IDCONTROLA
#define LPIDCONTROL LPIDCONTROLA
#endif
// Unicode IDCONTROLs will be flagged by having oName = 0, oInfo = 0,
// cBuf[0] = '\0', and cBuf[1] = UNICODE_CPL_SIGNATURE_BYTE
BOOL IsUnicodeCPL(LPIDCONTROL pidc);
// Useful constants I'd like to centralize
#define MAX_CCH_CPLNAME (ARRAYSIZE(((LPNEWCPLINFO)0)->szName)) // =32
#define MAX_CCH_CPLINFO (ARRAYSIZE(((LPNEWCPLINFO)0)->szInfo)) // =64
#ifdef WIN32
LRESULT CPL_CallEntry(LPCPLMODULE, HWND, UINT, LPARAM, LPARAM);
#else
#define CPL_CallEntry(pcplm, hwnd, msg, lParam1, lParam2) \
pcplm->lpfnCPL16(hwnd, msg, lParam1, lParam2)
#endif
void CPL_StripAmpersand(LPTSTR szBuffer);
BOOL CPL_Init(HINSTANCE hinst);
void CPL_FillIDC(LPIDCONTROL pidc, LPTSTR pszModule, int idIcon,
LPTSTR pszName, LPTSTR pszInfo);
int _FindCPLModuleByName(LPCTSTR pszModule);
LPCPLMODULE CPL_LoadCPLModule(LPCTSTR szModule);
int CPL_FreeCPLModule(LPCPLMODULE pcplm);
void CPLD_Destroy(PControlData lpData);
BOOL CPLD_GetModules(PControlData lpData);
void CPLD_GetRegModules(PControlData lpData);
int CPLD_InitModule(PControlData lpData, int nModule, MINST *lphModule);
void CPLD_GetControlID(PControlData lpData, const MINST * pminst, int nControl, LPIDCONTROL pidc);
void CPLD_AddControlToReg(PControlData lpData, const MINST * pminst, int nControl);
HRESULT STDAPICALLTYPE Control_GetSubObject(REFCLSID rclsid,
LPCTSTR pszContainer,
LPCTSTR pszSubObject,
REFIID iid,
void FAR* FAR* ppv);
HRESULT ControlObjs_CreateEI(IUnknown *punkOuter, LPCOMMINFO lpcinfo,
REFIID riid, IUnknown * *punkAgg);
#ifdef UNICODE
HRESULT ControlObjs_CreateEIA(IUnknown *punkOuter, LPCOMMINFO lpcinfo,
REFIID riid, IUnknown * *punkAgg);
#endif