windows-nt/Source/XPSP1/NT/base/pnp/hotplug/hotplug.h
2020-09-26 16:20:57 +08:00

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)