/*++ BUILD Version: 0002 - Increment this if a change has global effects /****************************************************************************/ /* */ /* PROGMAN.H - */ /* */ /* Include for the Windows Program Manager */ /* */ /****************************************************************************/ #ifndef RC_INVOKED #include #include #include #endif #include #include #include #include #include #ifndef RC_INVOKED #include "port1632.h" #undef RDW_VALIDMASK #endif #include #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;