335 lines
7.5 KiB
C
335 lines
7.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
pnpsubs.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the plug-and-play macros and constants.
|
||
|
||
Author:
|
||
|
||
Shie-Lin Tzong (shielint) 29-Jan-1995
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
|
||
#include "..\pnp\pnpi.h"
|
||
|
||
#if _PNP_POWER_
|
||
|
||
//
|
||
// The followings are structures to support IoRegisterPlugPlayNotification
|
||
//
|
||
|
||
typedef struct _IOP_NOTIFICATION_ENTRY {
|
||
LIST_ENTRY Next;
|
||
PDEVICE_OBJECT DeviceObject;
|
||
PVOID Context;
|
||
PDRIVER_NOTIFICATION_ENTRY NotificationEntry;
|
||
PVOID ResourceDescription;
|
||
} IOP_NOTIFICATION_ENTRY, *PIOP_NOTIFICATION_ENTRY;
|
||
|
||
typedef struct _IOP_NOTIFICATION_GUID_ENTRY {
|
||
LIST_ENTRY NextGuid;
|
||
GUID Guid;
|
||
LIST_ENTRY NotificationList;
|
||
} IOP_NOTIFICATION_GUID_ENTRY, *PIOP_NOTIFICATION_GUID_ENTRY;
|
||
|
||
//
|
||
// IopNotifyHwProfileChange - link list for hardware profile change notification.
|
||
// It directly links to IOP_NOTIFICATION_ENTRY list.
|
||
// Note, it is a *PLIST_ENTRY*. The list head for HwProfileNotification
|
||
// is actually a IO_NOTIFICATION_GUID_ENTRY which is allocated at PnP init.
|
||
//
|
||
|
||
extern PLIST_ENTRY IopNotifyHwProfileChange;
|
||
|
||
//
|
||
// IopNotifyDeviceArrival - link list for device arrival notification.
|
||
// It links the IOP_NOTIFICATION_GUID_ENTRY, which in turn links the
|
||
// IOP_NOTIFICATION_ENTRY list.
|
||
//
|
||
|
||
extern LIST_ENTRY IopNotifyDeviceArrival;
|
||
|
||
//
|
||
// IopNotifyDeviceRemoval - single link list for device removal notification.
|
||
// It links the IOP_NOTIFICATION_GUID_ENTRY, which in turn links the
|
||
// IOP_NOTIFICATION_ENTRY list.
|
||
//
|
||
|
||
extern LIST_ENTRY IopNotifyDeviceRemoval;
|
||
|
||
#endif // _PNP_POWER_
|
||
|
||
//
|
||
// Define callback routine for IopApplyFunctionToSubKeys &
|
||
// IopApplyFunctionToServiceInstances
|
||
//
|
||
typedef BOOLEAN (*PIOP_SUBKEY_CALLBACK_ROUTINE) (
|
||
IN HANDLE,
|
||
IN PUNICODE_STRING,
|
||
IN OUT PVOID
|
||
);
|
||
|
||
//
|
||
// This macro returns the pointer to the beginning of the data
|
||
// area of KEY_VALUE_FULL_INFORMATION structure.
|
||
// In the macro, k is a pointer to KEY_VALUE_FULL_INFORMATION structure.
|
||
//
|
||
|
||
#define KEY_VALUE_DATA(k) ((PCHAR)(k) + (k)->DataOffset)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// IopRegistryDataToUnicodeString(
|
||
// OUT PUNICODE_STRING u,
|
||
// IN PWCHAR p,
|
||
// IN ULONG l
|
||
// )
|
||
//
|
||
//--
|
||
#define IopRegistryDataToUnicodeString(u, p, l) \
|
||
{ \
|
||
ULONG len; \
|
||
\
|
||
PiRegSzToString((p), (l), &len, NULL); \
|
||
(u)->Length = (USHORT)len; \
|
||
(u)->MaximumLength = (USHORT)(l); \
|
||
(u)->Buffer = (p); \
|
||
}
|
||
|
||
//
|
||
// Title Index to set registry key value
|
||
//
|
||
|
||
#define TITLE_INDEX_VALUE 0
|
||
|
||
#if DBG
|
||
#define PNP_ASSERT(condition, message) \
|
||
if (!(condition)) { \
|
||
DbgPrint((message)); \
|
||
DbgBreakPoint(); \
|
||
}
|
||
#else
|
||
#define PNP_ASSERT(condition, message)
|
||
#endif
|
||
|
||
//
|
||
// Size of scratch buffer used in this module.
|
||
//
|
||
|
||
#define PNP_SCRATCH_BUFFER_SIZE 512
|
||
#define PNP_LARGE_SCRATCH_BUFFER_SIZE (PNP_SCRATCH_BUFFER_SIZE * 8)
|
||
|
||
//
|
||
// External References
|
||
//
|
||
|
||
extern PVOID IopPnpScratchBuffer1;
|
||
extern PVOID IopPnpScratchBuffer2;
|
||
|
||
NTSTATUS
|
||
IopAppendStringToValueKey (
|
||
IN HANDLE Handle,
|
||
IN PWSTR ValueName,
|
||
IN PUNICODE_STRING String,
|
||
IN BOOLEAN Create
|
||
);
|
||
|
||
NTSTATUS
|
||
IopPrepareDriverLoading (
|
||
IN PUNICODE_STRING KeyName,
|
||
IN HANDLE KeyHandle
|
||
);
|
||
|
||
NTSTATUS
|
||
IopRemoveStringFromValueKey (
|
||
IN HANDLE Handle,
|
||
IN PWSTR ValueName,
|
||
IN PUNICODE_STRING String
|
||
);
|
||
|
||
BOOLEAN
|
||
IopIsDuplicatedDevices(
|
||
IN PCM_RESOURCE_LIST Configuration1,
|
||
IN PCM_RESOURCE_LIST Configuration2,
|
||
IN PHAL_BUS_INFORMATION BusInfo1 OPTIONAL,
|
||
IN PHAL_BUS_INFORMATION BusInfo2 OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
IopMarkDuplicateDevice(
|
||
IN PUNICODE_STRING TargetKeyName,
|
||
IN ULONG TargetInstance,
|
||
IN PUNICODE_STRING SourceKeyName,
|
||
IN ULONG SourceInstance
|
||
);
|
||
|
||
BOOLEAN
|
||
IopConcatenateUnicodeStrings (
|
||
OUT PUNICODE_STRING Destination,
|
||
IN PUNICODE_STRING String1,
|
||
IN PUNICODE_STRING String2 OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
IopServiceInstanceToDeviceInstance (
|
||
IN HANDLE ServiceKeyHandle OPTIONAL,
|
||
IN PUNICODE_STRING ServiceKeyName OPTIONAL,
|
||
IN ULONG ServiceInstanceOrdinal,
|
||
OUT PUNICODE_STRING DeviceInstanceRegistryPath OPTIONAL,
|
||
OUT PHANDLE DeviceInstanceHandle OPTIONAL,
|
||
IN ACCESS_MASK DesiredAccess
|
||
);
|
||
|
||
NTSTATUS
|
||
IopOpenRegistryKeyPersist(
|
||
OUT PHANDLE Handle,
|
||
IN HANDLE BaseHandle OPTIONAL,
|
||
IN PUNICODE_STRING KeyName,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
IN BOOLEAN Create,
|
||
OUT PULONG Disposition OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
IopCreateMadeupNode(
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
OUT PHANDLE ReturnedHandle,
|
||
OUT PUNICODE_STRING KeyName,
|
||
OUT PULONG InstanceOrdinal,
|
||
IN BOOLEAN ResourceOwned
|
||
);
|
||
|
||
NTSTATUS
|
||
IopInitializePlugPlayServices(
|
||
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
||
);
|
||
|
||
NTSTATUS
|
||
IopOpenServiceEnumKeys (
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
OUT PHANDLE ServiceHandle OPTIONAL,
|
||
OUT PHANDLE ServiceEnumHandle OPTIONAL,
|
||
IN BOOLEAN CreateEnum
|
||
);
|
||
|
||
NTSTATUS
|
||
IopOpenCurrentHwProfileDeviceInstanceKey(
|
||
OUT PHANDLE Handle,
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ULONG Instance,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
IN BOOLEAN Create
|
||
);
|
||
|
||
NTSTATUS
|
||
IopGetDeviceInstanceCsConfigFlags(
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ULONG Instance,
|
||
OUT PULONG CsConfigFlags
|
||
);
|
||
|
||
NTSTATUS
|
||
IopSetDeviceInstanceCsConfigFlags(
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ULONG Instance,
|
||
IN ULONG CsConfigFlags
|
||
);
|
||
|
||
NTSTATUS
|
||
IopApplyFunctionToSubKeys(
|
||
IN HANDLE BaseHandle OPTIONAL,
|
||
IN PUNICODE_STRING KeyName,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
IN BOOLEAN IgnoreNonCriticalErrors,
|
||
IN PIOP_SUBKEY_CALLBACK_ROUTINE SubKeyCallbackRoutine,
|
||
IN OUT PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
IopRegMultiSzToUnicodeStrings(
|
||
IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation,
|
||
IN PUNICODE_STRING *UnicodeStringList,
|
||
OUT PULONG UnicodeStringCount
|
||
);
|
||
|
||
|
||
NTSTATUS
|
||
IopApplyFunctionToServiceInstances(
|
||
IN HANDLE ServiceKeyHandle OPTIONAL,
|
||
IN PUNICODE_STRING ServiceKeyName OPTIONAL,
|
||
IN ACCESS_MASK DesiredAccess,
|
||
IN BOOLEAN IgnoreNonCriticalErrors,
|
||
IN PIOP_SUBKEY_CALLBACK_ROUTINE DevInstCallbackRoutine,
|
||
IN OUT PVOID Context,
|
||
OUT PULONG ServiceInstanceOrdinal OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
IopFreeUnicodeStringList(
|
||
IN PUNICODE_STRING UnicodeStringList,
|
||
IN ULONG StringCount
|
||
);
|
||
|
||
NTSTATUS
|
||
IopQueryDeviceConfiguration(
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ULONG InstanceOrdinal,
|
||
OUT PHAL_BUS_INFORMATION BusInfo,
|
||
OUT PULONG DeviceInstanceFlags,
|
||
OUT PVOID Configuration,
|
||
IN ULONG BufferSize,
|
||
OUT PULONG ActualBufferSize
|
||
);
|
||
|
||
NTSTATUS
|
||
IopDriverLoadingFailed(
|
||
IN HANDLE KeyHandle OPTIONAL,
|
||
IN PUNICODE_STRING KeyName OPTIONAL
|
||
);
|
||
|
||
#if _PNP_POWER_
|
||
ULONG
|
||
IopDetermineResourceListSize(
|
||
IN PCM_RESOURCE_LIST ResourceList
|
||
);
|
||
|
||
PIO_RESOURCE_REQUIREMENTS_LIST
|
||
IopAddDefaultResourceList (
|
||
IN PIO_RESOURCE_REQUIREMENTS_LIST IoResourceList,
|
||
IN PCM_RESOURCE_LIST CmResourceList
|
||
);
|
||
|
||
NTSTATUS
|
||
IopQueryDeviceConfigurationVector(
|
||
IN PUNICODE_STRING ServiceKeyName,
|
||
IN ULONG InstanceOrdinal,
|
||
OUT PULONG DeviceInstanceFlags,
|
||
OUT PIO_RESOURCE_REQUIREMENTS_LIST ConfigurationVector,
|
||
IN ULONG BufferSize,
|
||
OUT PULONG ActualBufferSize
|
||
);
|
||
|
||
PDRIVER_OBJECT
|
||
IopReferenceDriverObjectByName (
|
||
IN PUNICODE_STRING DriverName
|
||
);
|
||
|
||
#endif
|