Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

703 lines
25 KiB

/*++ BUILD Version: 0002 - Increment this if a change has global effects
/****************************************************************************/
/* */
/* PROGMAN.H - */
/* */
/* Include for the Windows Program Manager */
/* */
/****************************************************************************/
#ifndef RC_INVOKED
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif
#include <setjmp.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <winuserp.h>
#ifndef RC_INVOKED
#include "port1632.h"
#undef RDW_VALIDMASK
#endif
#include <pmvdm.h>
#include "pmhelp.h"
#include "shellapi.h"
#include "shlapip.h"
/*--------------------------------------------------------------------------*/
/* */
/* Typedefs */
/* */
/*--------------------------------------------------------------------------*/
typedef struct tagITEM {
struct tagITEM *pNext; /* link to next item */
int iItem; /* index in group */
DWORD dwDDEId; /* id used for Apps querying Progman */
/* for its properties via DDE */
RECT rcIcon; /* icon rectangle */
HICON hIcon; /* the actual icon */
RECT rcTitle; /* title rectangle */
} ITEM, *PITEM;
typedef struct tagGROUP {
struct tagGROUP *pNext; /* link to next group */
HWND hwnd; /* hwnd of group window */
HANDLE hGroup; /* global handle of group object */
PITEM pItems; /* pointer to first item */
LPTSTR lpKey; /* name of group key */
WORD wIndex; /* index in PROGMAN.INI of group */
BOOL fRO; /* group file is readonly */
BOOL fCommon; /* group is a common group vs a personal group */
FILETIME ftLastWriteTime;
HBITMAP hbm; /* bitmap 'o icons */
WORD fLoaded;
PSECURITY_DESCRIPTOR pSecDesc;
} GROUP, *PGROUP;
/*
* .GRP File format structures -
*/
typedef struct tagGROUPDEF {
DWORD dwMagic; /* magical bytes 'PMCC' */
DWORD cbGroup; /* length of group segment */
RECT rcNormal; /* rectangle of normal window */
POINT ptMin; /* point of icon */
WORD wCheckSum; /* adjust this for zero sum of file */
WORD nCmdShow; /* min, max, or normal state */
DWORD pName; /* name of group */
/* these four change interpretation */
WORD cxIcon; /* width of icons */
WORD cyIcon; /* hieght of icons */
WORD wIconFormat; /* planes and BPP in icons */
WORD wReserved; /* This word is no longer used. */
WORD cItems; /* number of items in group */
WORD Reserved1;
DWORD Reserved2;
DWORD rgiItems[1]; /* array of ITEMDEF offsets */
} GROUPDEF, *PGROUPDEF;
typedef GROUPDEF *LPGROUPDEF;
typedef struct tagITEMDEF {
POINT pt; /* location of item icon in group */
WORD iIcon; /* id of item icon */
WORD wIconVer; /* icon version */
WORD cbIconRes; /* size of icon resource */
WORD wIconIndex; /* index of the item icon (not the same as the id) */
DWORD pIconRes; /* offset of icon resource */
DWORD pName; /* offset of name string */
DWORD pCommand; /* offset of command string */
DWORD pIconPath; /* offset of icon path */
} ITEMDEF, *PITEMDEF;
typedef ITEMDEF *LPITEMDEF;
/* the pointers in the above structures are short pointers relative to the
* beginning of the segments. This macro converts the short pointer into
* a long pointer including the proper segment/selector value. It assumes
* that its argument is an lvalue somewhere in a group segment, for example,
* PTR(lpgd->pName) returns a pointer to the group name, but k=lpgd->pName;
* PTR(k) is obviously wrong as it will use either SS or DS for its segment,
* depending on the storage class of k.
*/
#define PTR(base, offset) (LPBYTE)((PBYTE)base + offset)
/* PTR2 is used for those cases where a variable already contains an offset
* (The "case that doesn't work", above)
*/
#define PTR2(lp,offset) ((LPBYTE)MAKELONG(offset,HIWORD(lp)))
/* this macro is used to retrieve the i-th item in the group segment. Note
* that this pointer will NOT be NULL for an unused slot.
*/
#define ITEM(lpgd,i) ((LPITEMDEF)PTR(lpgd, lpgd->rgiItems[i]))
/*--------------------------------------------------------------------------*/
/* */
/* Tag Stuff */
/* */
/*--------------------------------------------------------------------------*/
typedef struct _tag
{
WORD wID; // tag identifier
WORD dummy1; // need this for alignment!
int wItem; // (unde the covers 32 bit point!)item the tag belongs to
WORD cb; // size of record, including id and count
WORD dummy2; // need this for alignment!
BYTE rgb[1];
} PMTAG, FAR * LPPMTAG;
#define PMTAG_MAGIC GROUP_MAGIC
/* range 8000 - 80FF > global
* range 8100 - 81FF > per item
* all others reserved
*/
#define ID_MAINTAIN 0x8000
/* bit used to indicate a tag that should be kept even if the writer
* doesn't recognize it.
*/
#define ID_MAGIC 0x8000
/* data: the string 'TAGS'
*/
#define ID_WRITERVERSION 0x8001
/* data: string in the form [9]9.99[Z].99
*/
#define ID_APPLICATIONDIR 0x8101
/* data: ASCIZ string of directory where application may be
* located.
* this is defined as application dir rather than default dir
* since the default dir is explicit in the 3.0 command line and
* must stay there. The true "new information" is the application
* directory. If not present, search the path.
*/
#define ID_HOTKEY 0x8102
/* data: WORD hotkey index
*/
#define ID_MINIMIZE 0x8103
/* data none
*/
#define ID_NEWVDM 0x8104
/* data none
*/
#define ID_LASTTAG 0xFFFF
/* the last tag in the file
*/
/*--------------------------------------------------------------------------*/
/* */
/* For Icon Extraction */
/* */
/*--------------------------------------------------------------------------*/
typedef struct _MyIconInfo {
HICON hIcon;
INT iIconId;
} MYICONINFO, *LPMYICONINFO;
/*--------------------------------------------------------------------------*/
/* */
/* Function Templates */
/* */
/*--------------------------------------------------------------------------*/
BOOL FAR PASCAL IsRemoteDrive(int);
BOOL FAR PASCAL IsRemovableDrive(int);
int FAR PASCAL MyMessageBox(HWND, WORD, WORD , LPTSTR , WORD);
BOOL FAR PASCAL AppInit(HANDLE, LPTSTR , int);
void FAR PASCAL BuildDescription(LPTSTR, LPTSTR);
WORD FAR PASCAL ExecProgram(LPTSTR, LPTSTR, LPTSTR, BOOL, DWORD, WORD, BOOL);
void FAR PASCAL ExecItem(PGROUP,PITEM,BOOL,BOOL);
WORD FAR PASCAL SelectionType(void);
BOOL APIENTRY ProgmanCommandProc(HWND, WPARAM, LPARAM);
void FAR PASCAL WriteINIFile(void);
void FAR PASCAL ArrangeItems(HWND);
void FAR PASCAL WriteGroupsSection(void);
LRESULT APIENTRY DDEMsgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT APIENTRY AppIconDDEMsgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT APIENTRY AppDescriptionDDEMsgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT APIENTRY AppWorkingDirDDEMsgProc(HWND, UINT, WPARAM, LPARAM);
BOOL FAR PASCAL IsGroupReadOnly(LPTSTR szGroupKey, BOOL bCommonGroup);
LPGROUPDEF FAR PASCAL LockGroup(HWND);
void FAR PASCAL UnlockGroup(HWND);
LPITEMDEF FAR PASCAL LockItem(PGROUP, PITEM);
HICON FAR PASCAL GetItemIcon(HWND, PITEM);
HWND FAR PASCAL LoadGroupWindow(LPTSTR, WORD, BOOL);
PITEM FAR PASCAL CreateNewItem(HWND,LPTSTR,LPTSTR,LPTSTR,LPTSTR,WORD,BOOL,WORD,WORD,HICON,LPPOINT,DWORD);
HWND FAR PASCAL CreateNewGroup(LPTSTR, BOOL);
void FAR PASCAL DeleteItem(PGROUP, PITEM);
void FAR PASCAL DeleteGroup(HWND);
void FAR PASCAL ChangeGroupTitle(HWND, LPTSTR, BOOL);
void FAR PASCAL CreateItemIcons(HWND);
void FAR PASCAL GetItemText(PGROUP,PITEM,LPTSTR,int);
void FAR PASCAL InvalidateIcon(PGROUP,PITEM);
void FAR PASCAL ComputeIconPosition(PGROUP,POINT,LPRECT,LPRECT,LPTSTR);
void FAR PASCAL CalcGroupScrolls(HWND);
BOOL FAR PASCAL GroupCheck(PGROUP);
void FAR PASCAL UnloadGroupWindow(HWND);
void FAR PASCAL NukeIconBitmap(PGROUP pGroup);
WORD FAR PASCAL GroupFlag(PGROUP, PITEM, WORD);
WORD FAR PASCAL GetGroupTag(PGROUP, PITEM, WORD, LPTSTR, WORD);
VOID FAR PASCAL LoadAllGroups(VOID);
PITEM FAR PASCAL DuplicateItem(PGROUP,PITEM,PGROUP,LPPOINT);
void FAR PASCAL GetItemCommand(PGROUP,PITEM,LPTSTR,LPTSTR);
VOID APIENTRY RegisterDDEClasses(HANDLE);
INT MyDwordAlign(INT);
LRESULT APIENTRY GroupWndProc(HWND , UINT, WPARAM, LPARAM);
LRESULT APIENTRY ProgmanWndProc(HWND , UINT , WPARAM, LPARAM );
WORD FAR PASCAL MyDialogBox(WORD, HWND , DLGPROC );
INT_PTR APIENTRY ChooserDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY BrowseDlgProc(HWND, UINT , WPARAM , LPARAM );
INT_PTR APIENTRY RunDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY ExitDlgProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR APIENTRY IconDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY NewItemDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY NewGroupDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY MoveItemDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY CopyItemDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY EditItemDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY EditGroupDlgProc(HWND, UINT , WPARAM , LPARAM );
INT_PTR APIENTRY AboutDlgProc(HWND , UINT , WPARAM , LPARAM );
INT_PTR APIENTRY HotKeyDlgProc(HWND , UINT , WPARAM , LPARAM );
BOOL APIENTRY ShutdownDialog(HANDLE, HWND);
INT_PTR APIENTRY NewLogoffDlgProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR APIENTRY UpdateGroupsDlgProc(HWND, UINT, WPARAM, LPARAM);
VOID APIENTRY HandleDosApps
(
LPTSTR sz // Full path sans arguments.
);
DWORD APIENTRY ValidatePath
(
HWND hDlg,
LPTSTR szPath, // Path to item
LPTSTR szExePath, // Path to associated exe.
LPTSTR szDir // Path to working directory.
);
VOID APIENTRY GetDirectoryFromPath
(
LPTSTR szFilePath, // Full path to a file.
LPTSTR szDir // Directory returned in here, the buffer is assumed
// to be as big as szFilePath.
);
VOID APIENTRY GetFilenameFromPath
(
LPTSTR szPath,
LPTSTR szFilename
);
void APIENTRY TagExtension
(
LPTSTR szPath,
UINT cbPath
);
void APIENTRY StripArgs
(
LPTSTR szCmmdLine // A command line.
);
BOOL APIENTRY ValidPathDrive
(
LPTSTR lpstr
);
LRESULT APIENTRY MessageFilter(int , WPARAM , LPARAM) ;
BOOL APIENTRY SaveGroup(HWND, BOOL);
BOOL SaveGroupsContent(BOOL);
BOOL IsReadOnly(LPTSTR);
VOID FAR PASCAL StartupGroup(HWND hwnd);
VOID APIENTRY PMHelp(HWND);
VOID FAR PASCAL RemoveLeadingSpaces(LPTSTR sz);
VOID FAR PASCAL BringItemToTop(PGROUP pGroup, PITEM pItem, BOOL fUpdate);
VOID APIENTRY SaveRecentFileList (HWND hwnd, LPTSTR szCurrentFile, WORD idControl);
/*--------------------------------------------------------------------------*/
/* */
/* Defines */
/* */
/*--------------------------------------------------------------------------*/
#define CharSizeOf(x) (sizeof(x) / sizeof(*x))
#define ByteCountOf(x) ((x) * sizeof(TCHAR))
#define CITEMSMAX 50
//
// CreateNewItem flags
//
#define CI_ACTIVATE 0x1
#define CI_SET_DOS_FULLSCRN 0x2
#define CI_NO_ASSOCIATION 0x4
#define CI_SEPARATE_VDM 0x8
/* magic number for .GRP file validation
*/
#define GROUP_MAGIC 0x43434D50L /* 'PMCC' */
#define GROUP_UNICODE 0x43554D50L /* 'PMUC' */
#define MAXTITLELEN 50 /* Length of MessageBox titles */
#define MAXMESSAGELEN 512 /* Length of MessageBox messages */
#define MAXITEMNAMELEN 40
//#define MAXITEMPATHLEN 64+16+48 /* Path + 8.3 + Drive(colon) + arguments */
#define MAXITEMPATHLEN MAX_PATH - 1 // -1 for backward compatibility
// with shell32.dll
#define MAXGROUPNAMELEN 30
#define NSLOTS 16 /* initial number of items entries */
#define PATH_INVALID 0
#define PATH_INVALID_OK 1
#define PATH_VALID 2
#define CCHGROUP 5 // length of the string "Group"
#define CCHCOMMONGROUP 6 // length of the string "CGroup"
#define CGROUPSMAX 40 // The max number of groups allowed.
#define TYPE_ITEM 0
#define TYPE_PERSGROUP 1
#define TYPE_COMMONGROUP 2
/* Resource Numbers */
#define PROGMANICON 1
#define DOSAPPICON 2
#define WORDICON 3
#define SHEETICON 4
#define DATAICON 5
#define COMMICON 6
#define ITEMICON 7
#define PERSGROUPICON 8
#define COMMGROUPICON 9
#define WINDOWSICON 10 /* Should be large ? */
#define MSDOSICON 11
#define PMACCELS 1004
#define PROGMANMENU 1005
#define GROUPICON 146
#define DOSAPPICONINDEX 1
#define ITEMICONINDEX 6
#define ITEMLISTBOX 1
#define GWLP_PGROUP 0 // Used in the Group window frames
#define GWL_EXITING 0 // Used in the main window frame
#define DRAG_SWP 1
#define DRAG_COPY 2
/* DDE Messaging Stuff */
#define ACK_POS 0x8000
#define ACK_NEG 0x0000
// message sent to indicate another instance has been exec'd
#define WM_EXECINSTANCE (WM_USER+100)
// message sent to reload a group
#define WM_RELOADGROUP (WM_USER+101)
// message sent to delete a group
#define WM_UNLOADGROUP (WM_USER+102)
// Lock errors
#define LOCK_LOWMEM 1
#define LOCK_FILECHANGED 2
// Binary type defins
#define BINARY_TYPE_DEFAULT 1
#define BINARY_TIMEOUT_DEFAULT 500
// Recent file list defines
#define MYCBN_SELCHANGE (WM_USER+5)
#define INIT_MAX_FILES 4
#define FILES_KEY L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Program Manager\\Recent File List"
#define MAXFILES_ENTRY L"Max Files"
#define FILE_ENTRY L"File%lu"
/* Menu Command Defines */
#define IDM_FILE 0
#define IDM_NEW 101
#define IDM_OPEN 102
#define IDM_MOVE 103
#define IDM_COPY 104
#define IDM_DELETE 105
#define IDM_PROPS 106
#define IDM_RUN 107
#define IDM_EXIT 108
#define IDM_SAVE 109
#define IDM_SHUTDOWN 110
#define IDM_OPTIONS 1
#define IDM_AUTOARRANGE 201
#define IDM_MINONRUN 202
#define IDM_HOTKEY 203
#define IDM_SAVESETTINGS 204
#define IDM_SAVENOW 205
#define IDM_ANSIGROUPS 206
#define IDM_WINDOW 2
#define IDM_CASCADE 301
#define IDM_TILE 302
#define IDM_ARRANGEICONS 303
#define IDM_CHILDSTART 310
#define IDM_HELP 3
#define IDM_HELPINDEX 401
#define IDM_HELPHELP 402
#define IDM_ABOUT 403
#define IDM_HELPSEARCH 404
/* StringTable Defines */
#define IDS_APPTITLE 1
#define IDS_PMCLASS 2
#define IDS_GROUPCLASS 3
#define IDS_ITEMCLASS 4
#define IDS_DATAFILE 5
#define IDS_SETTINGS 7
#define IDS_CONFIRMDELTITLE 40 /* Must be > 32 */
#define IDS_CONFIRMDELITEMMSG 41
#define IDS_CONFIRMDELGROUPMSG 42
#define IDS_NOICONSTITLE 50
#define IDS_NOICONSMSG 51
#define IDS_BADPATHTITLE 52
#define IDS_BADPATHMSG 53
#define IDS_NETPATHTITLE 54
#define IDS_REMOVEPATHTITLE 55
#define IDS_PATHWARNING 56
#define IDS_EXECERRTITLE 60
#define IDS_UNKNOWNMSG 61
#define IDS_NOMEMORYMSG 62
#define IDS_FILENOTFOUNDMSG 63
#define IDS_MANYOPENFILESMSG 64
#define IDS_NOASSOCMSG 65
#define IDS_MULTIPLEDSMSG 66
#define IDS_ASSOCINCOMPLETE 67
#define IDS_COPYDLGTITLE 70
#define IDS_COPYDLGTITLE1 71
#define IDS_GROUPS 72
#define IDS_NOGRPFILE 73
#define IDS_LOWMEM 74
#define IDS_BADFILE 75
#define IDS_CANTWRITEGRP 76
#define IDS_GROUPFILEERR 77
#define IDS_GRPISRO 78
#define IDS_EXTRACTERROR 79
#define IDS_EEGROUPRO 80
#define IDS_CANTWRITEGRPS 81
#define IDS_OOMEXITTITLE 110
#define IDS_OOMEXITMSG 111
#define IDS_GROUPRO 112
#define IDS_CANTRENAMETITLE 113
#define IDS_CANTRENAMEMSG 114
#define IDS_TOOMANYITEMS 115
#define IDS_OS2APPMSG 116
#define IDS_NEWWINDOWSMSG 117
#define IDS_PMODEONLYMSG 118
#define IDS_ALREADYLOADED 119
#define IDS_STARTUP 120
#define IDS_PLUS 121
#define IDS_GRPHASCHANGED 122
#define IDS_NONE 123
#define IDS_EXIT 124
#define IDS_DUPHOTKEYTTL 125
#define IDS_DUPHOTKEYMSG 126
#define IDS_BROWSE 127
#define IDS_NEWITEMPROGS 128
#define IDS_PROPERTIESPROGS 129
#define IDS_CHNGICONPROGS 130
#define IDS_TOOMANYGROUPS 131
#define IDS_ACCESSDENIED 133
#define IDS_DDEFAIL 134
#define IDS_LOWMEMONINIT 135
#define IDS_PIFINIFILE 136
#define IDS_PIFSECTION 137
#define IDS_EXECSETUP 138
#define IDS_WINHELPERR 139
#define IDS_PIFADDINFO 140
#define IDS_BADPATHMSG2 141
#define IDS_BADPATHMSG3 142
#define IDS_LOWMEMONEXIT 143
#define IDS_WININIERR 144
#define IDS_STARTUPERR 145
#define IDS_CMDLINEERR 146
#define IDS_ITEMINGROUP 147
#define IDS_LOWMEMONEXTRACT 148
#define IDS_DEFICONSFILE 149
#define IDS_COMPRESSEDEXE 150
#define IDS_INVALIDDLL 151
#define IDS_SHAREERROR 152
#define IDS_CANTWRITEGRPDISK 153
#define IDS_COMMDLGLOADERR 154
#define IDS_NOICONSMSG1 155
#define IDS_NOGRPFILE2 156
#define IDS_REGISTRYERROR 164
#define IDS_ERRORDELETEGROUP 165
#define IDS_LOGOFFERROR 166
#define IDS_COMMONGRPSUFFIX 167
#define IDS_COMMONGROUPPROP 168
#define IDS_COMMONGROUPERR 169
#define IDS_NOCOMMONGRPS 170
#define IDS_NO_PERMISSION_SHUTDOWN 171
#define IDS_SHUTDOWN_MESSAGE 172
#define IDS_DEFAULTSTARTUP 173
#define IDS_TOOMANYCOMMONGROUPS 174
#define IDS_LOGOFF 175
#define IDS_SHUTDOWN 176
#define IDS_MSGBOXSTR1 177
#define IDS_MSGBOXSTR2 178
#define IDS_INSUFFICIENTQUOTA 179
#define IDS_ANSIGROUPSMENU 180
//#ifdef JAPAN
//#define IDS_BADPORTPATHTITLE 1102
//#define IDS_BADPORTPATHMSG 1103
//#endif //JAPAN
#include "pmdlg.h"
#include "pmreg.h"
#include "notify.h"
/*--------------------------------------------------------------------------*/
/* */
/* Global Externs */
/* */
/*--------------------------------------------------------------------------*/
extern BOOL UserIsAdmin;
extern BOOL AccessToCommonGroups;
extern BOOL bLoadIt;
extern BOOL bMinOnRun;
extern BOOL bArranging;
extern BOOL bAutoArrange;
extern BOOL bAutoArranging;
extern BOOL bExitWindows;
extern BOOL bSaveSettings;
extern BOOL bIconTitleWrap;
extern BOOL bScrolling;
extern BOOL bLoadEvil;
extern BOOL bMove;
extern BOOL bInDDE;
extern BOOL fInExec;
extern BOOL fNoRun;
extern BOOL fNoClose;
extern BOOL fNoSave;
extern BOOL fNoFileMenu;
extern BOOL fLowMemErrYet;
extern BOOL fExiting;
extern BOOL fErrorOnExtract;
extern BOOL bFrameSysMenu;
extern TCHAR szNULL[];
extern TCHAR szProgman[];
extern TCHAR szTitle[];
//
// Program Manager's Settings keys
//
extern TCHAR szWindow[];
extern TCHAR szOrder[];
extern TCHAR szAnsiOrder[];
extern TCHAR szStartup[];
extern TCHAR szAutoArrange[];
extern TCHAR szSaveSettings[];
extern TCHAR szMinOnRun[];
extern TCHAR szFocusOnCommonGroup[];
extern TCHAR szMessage[MAXMESSAGELEN+1];
extern TCHAR szNameField[MAXITEMPATHLEN+1];
extern TCHAR szPathField[MAXITEMPATHLEN+1];
extern TCHAR szIconPath[MAXITEMPATHLEN+1];
extern TCHAR szDirField[];
extern TCHAR szOriginalDirectory[];
extern TCHAR szWindowsDirectory[];
extern TCHAR szOOMExitMsg[64];
extern TCHAR szOOMExitTitle[32];
extern HANDLE hAccel;
extern HINSTANCE hAppInstance;
extern HANDLE hCommdlg;
extern HICON hDlgIcon;
extern HICON hItemIcon;
extern HICON hProgmanIcon;
extern HICON hGroupIcon;
extern HICON hCommonGrpIcon;
extern HICON hIconGlobal;
extern HWND hwndProgman;
extern HWND hwndMDIClient;
extern HBRUSH hbrWorkspace;
extern int nGroups;
extern int dyBorder;
extern int iDlgIconId;
extern int iDlgIconIndex;
extern int cxIcon;
extern int cyIcon;
extern int cxIconSpace;
extern int cyIconSpace;
extern int cxArrange;
extern int cyArrange;
extern int cxOffset;
extern int cyOffset;
extern WORD wPendingHotKey;
extern DWORD dwDDEAppId;
extern DWORD dwEditLevel;
extern WORD wLockError;
extern UINT uiActivateShellWindowMessage;
extern UINT uiConsoleWindowMessage;
extern UINT uiSaveSettingsMessage; // for User Profile Editor: upedit.exe
extern PGROUP pFirstGroup;
extern PGROUP pCurrentGroup;
extern PGROUP pActiveGroup;
extern PGROUP *pLastGroup;
extern PGROUP pExecingGroup;
extern PITEM pExecingItem;
extern RECT rcDrag;
extern HWND hwndDrag;
extern WORD wNewSelection;
extern HFONT hFontTitle;
extern UINT uiHelpMessage; // stuff for help
extern UINT uiBrowseMessage; // stuff for help
extern WORD wMenuID;
extern HANDLE hSaveMenuHandle; /*Save hMenu into one variable*/
extern WORD wSaveFlags; /*Save flags into another*/
extern HANDLE hSaveMenuHandleAroundSendMessage;/*Save hMenu into one variable*/
extern WORD wSaveFlagsAroundSendMessage; /*Save flags into another*/
extern WORD wSaveMenuIDAroundSendMessage;
extern DWORD dwContext;
extern HHOOK hhkMsgFilter;
extern TCHAR szProgmanHelp[];
extern BOOL bUseANSIGroups;
extern PSECURITY_ATTRIBUTES pSecurityAttributes;
extern PSECURITY_ATTRIBUTES pAdminSecAttr;
extern BOOL bDisableDDE;