//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 2000 // // File: hotplug.h // //-------------------------------------------------------------------------- // // 2001/02/01 - Disable support for *both* arrival bubbles and departure // bubbles (hotplug.dll must be kept in sync here.) This code is disabled for // beta2, and should be removed afterwards if feedback is positive. // // (Note that HotPlugSurpriseWarnW would need to be put back into hotplug.def // were this stuff reenabled. Several dialogs would need to be recovered as // well...) // #define BUBBLES 0 #define UNDOCK_WARNINGS 0 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include #include #include #include #include } #include "resource.h" #include "devicecol.h" #define STWM_NOTIFYHOTPLUG STWM_NOTIFYPCMCIA #define STSERVICE_HOTPLUG STSERVICE_PCMCIA #define HOTPLUG_REGFLAG_NOWARN PCMCIA_REGFLAG_NOWARN #define HOTPLUG_REGFLAG_VIEWALL (PCMCIA_REGFLAG_NOWARN << 1) #define TIMERID_DEVICECHANGE 4321 #define ARRAYLEN(array) (sizeof(array) / sizeof(array[0])) LRESULT CALLBACK DevTreeDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK RemoveConfirmDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK SurpriseWarnDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ); #if BUBBLES LRESULT CALLBACK SurpriseWarnBalloonProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); #endif LRESULT CALLBACK SafeRemovalBalloonProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK DockSafeRemovalBalloonProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); extern HMODULE hHotPlug; typedef struct _DeviceTreeNode { LIST_ENTRY SiblingEntry; LIST_ENTRY ChildSiblingList; PTCHAR InstanceId; PTCHAR FriendlyName; PTCHAR DeviceDesc; PTCHAR ClassName; PTCHAR DriveList; PTCHAR Location; struct _DeviceTreeNode *ParentNode; struct _DeviceTreeNode *NextChildRemoval; HTREEITEM hTreeItem; DEVINST DevInst; GUID ClassGuid; DWORD Capabilities; int TreeDepth; PDEVINST EjectRelations; USHORT NumEjectRelations; PDEVINST RemovalRelations; USHORT NumRemovalRelations; ULONG Problem; ULONG DevNodeStatus; BOOL bCopy; } DEVTREENODE, *PDEVTREENODE; typedef struct _DeviceTreeData { DWORD Size; HWND hwndTree; HWND hDlg; HWND hwndRemove; HMACHINE hMachine; int TreeDepth; PDEVTREENODE SelectedTreeNode; PDEVTREENODE ChildRemovalList; LIST_ENTRY ChildSiblingList; DEVINST DevInst; PTCHAR EjectDeviceInstanceId; SP_CLASSIMAGELIST_DATA ClassImageList; BOOLEAN ComplexView; BOOLEAN HotPlugTree; BOOLEAN AllowRefresh; BOOLEAN RedrawWait; BOOLEAN RefreshEvent; BOOLEAN HideUI; TCHAR MachineName[MAX_COMPUTERNAME_LENGTH+1]; } DEVICETREE, *PDEVICETREE; #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR)) void OnContextHelp( LPHELPINFO HelpInfo, PDWORD ContextHelpIDs ); // // from init.c // DWORD WINAPI HandleVetoedOperation( LPWSTR szCmd, VETOED_OPERATION RemovalVetoType ); // // from devtree.c // LONG AddChildSiblings( PDEVICETREE DeviceTree, PDEVTREENODE ParentNode, DEVINST DeviceInstance, int TreeDepth, BOOL Recurse ); void RemoveChildSiblings( PDEVICETREE DeviceTree, PLIST_ENTRY ChildSiblingList ); PTCHAR FetchDeviceName( PDEVTREENODE DeviceTreeNode ); BOOL DisplayChildSiblings( PDEVICETREE DeviceTree, PLIST_ENTRY ChildSiblingList, HTREEITEM hParentTreeItem, BOOL RemovableParent ); void AddChildRemoval( PDEVICETREE DeviceTree, PLIST_ENTRY ChildSiblingList ); void ClearRemovalList( PDEVICETREE DeviceTree ); PDEVTREENODE DevTreeNodeByInstanceId( PTCHAR InstanceId, PLIST_ENTRY ChildSiblingList ); PDEVTREENODE DevTreeNodeByDevInst( DEVINST DevInst, PLIST_ENTRY ChildSiblingList ); PDEVTREENODE TopLevelRemovalNode( PDEVICETREE DeviceTree, PDEVTREENODE DeviceTreeNode ); void AddEjectToRemoval( PDEVICETREE DeviceTree ); extern TCHAR szUnknown[64]; extern TCHAR szHotPlugFlags[]; // // notify.c // void OnTimerDeviceChange( PDEVICETREE DeviceTree ); BOOL RefreshTree( PDEVICETREE DeviceTree ); // // miscutil.c // void SetDlgText( HWND hDlg, int iControl, int nStartString, int nEndString ); VOID HotPlugPropagateMessage( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ); BOOL RemovalPermission( void ); int HPMessageBox( HWND hWnd, int IdText, int IdCaption, UINT Type ); void InvalidateTreeItemRect( HWND hwndTree, HTREEITEM hTreeItem ); DWORD GetHotPlugFlags( PHKEY phKey ); PTCHAR BuildFriendlyName( DEVINST DevInst, HMACHINE hMachine ); PTCHAR BuildLocationInformation( DEVINST DevInst, HMACHINE hMachine ); LPTSTR DevNodeToDriveLetter( DEVINST DevInst ); BOOL IsHotPlugDevice( DEVINST DevInst, HMACHINE hMachine ); BOOL OpenPipeAndEventHandles( LPWSTR szCmd, LPHANDLE lphHotPlugPipe, LPHANDLE lphHotPlugEvent ); BOOL VetoedRemovalUI( IN PVETO_DEVICE_COLLECTION VetoedRemovalCollection ); void DisplayDriverBlockBalloon( IN PDEVICE_COLLECTION blockedDriverCollection ); #if BUBBLES VOID OpenGetSurpriseUndockObjects( OUT HANDLE *SurpriseUndockTimer, OUT HANDLE *SurpriseUndockEvent ); // // We suppress bubbles for some period of time after a dock event. Free build, // ~15 secs, Checked build ~60. // #if DBG #define BUBBLE_SUPPRESSION_TIME 60 #else #define BUBBLE_SUPPRESSION_TIME 15 #endif #endif // BUBBLES #define WUM_EJECTDEVINST (WM_USER+279)