385 lines
6.3 KiB
C
385 lines
6.3 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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 <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.h>
|
||
|
#include <stdio.h>
|
||
|
#include <cpl.h>
|
||
|
#include <commctrl.h>
|
||
|
#include <shellapi.h>
|
||
|
#include <shlwapi.h>
|
||
|
#include <devguid.h>
|
||
|
#include <dbt.h>
|
||
|
#include <help.h>
|
||
|
#include <systrayp.h>
|
||
|
#include <shobjidl.h>
|
||
|
|
||
|
extern "C" {
|
||
|
#include <setupapi.h>
|
||
|
#include <spapip.h>
|
||
|
#include <cfgmgr32.h>
|
||
|
#include <shimdb.h>
|
||
|
#include <regstr.h>
|
||
|
}
|
||
|
|
||
|
#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)
|