/*++ BUILD Version: 0002 Copyright (c) 1989 Microsoft Corporation Module Name: iop.h Abstract: This module contains the private structure definitions and APIs used by the NT I/O system. Author: Darryl E. Havens (darrylh) 17-Apr-1989 Revision History: --*/ #ifndef _IOPCMN_ #define _IOPCMN_ // // 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) #define ALIGN_POINTER(Offset) (PVOID) \ ((((ULONG_PTR)(Offset) + sizeof(ULONG_PTR)-1)) & (~(sizeof(ULONG_PTR) - 1))) #define ALIGN_POINTER_OFFSET(Offset) (ULONG_PTR) ALIGN_POINTER(Offset) // // IO manager exports to Driver Verifier // NTSTATUS IopInvalidDeviceRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); extern POBJECT_TYPE IoDeviceObjectType; #include "pnpmgr\pplastgood.h" //++ // // VOID // IopInitializeIrp( // IN OUT PIRP Irp, // IN USHORT PacketSize, // IN CCHAR StackSize // ) // // Routine Description: // // Initializes an IRP. // // Arguments: // // Irp - a pointer to the IRP to initialize. // // PacketSize - length, in bytes, of the IRP. // // StackSize - Number of stack locations in the IRP. // // Return Value: // // None. // //-- #define IopInitializeIrp( Irp, PacketSize, StackSize ) { \ RtlZeroMemory( (Irp), (PacketSize) ); \ (Irp)->Type = (CSHORT) IO_TYPE_IRP; \ (Irp)->Size = (USHORT) ((PacketSize)); \ (Irp)->StackCount = (CCHAR) ((StackSize)); \ (Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1); \ (Irp)->ApcEnvironment = KeGetCurrentApcEnvironment(); \ InitializeListHead (&(Irp)->ThreadListEntry); \ (Irp)->Tail.Overlay.CurrentStackLocation = \ ((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + \ sizeof( IRP ) + \ ( (StackSize) * sizeof( IO_STACK_LOCATION )))); } // // IO manager exports to PNP // BOOLEAN IopCallBootDriverReinitializationRoutines( ); BOOLEAN IopCallDriverReinitializationRoutines( ); VOID IopCreateArcNames( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); PSECURITY_DESCRIPTOR IopCreateDefaultDeviceSecurityDescriptor( IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN DeviceHasName, IN PUCHAR Buffer, OUT PACL *AllocatedAcl, OUT PSECURITY_INFORMATION SecurityInformation OPTIONAL ); NTSTATUS IopGetDriverNameFromKeyNode( IN HANDLE KeyHandle, OUT PUNICODE_STRING DriverName ); NTSTATUS IopGetRegistryKeyInformation( IN HANDLE KeyHandle, OUT PKEY_FULL_INFORMATION *Information ); NTSTATUS IopGetRegistryValue( IN HANDLE KeyHandle, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *Information ); NTSTATUS IopInitializeBuiltinDriver( IN PUNICODE_STRING DriverName, IN PUNICODE_STRING RegistryPath, IN PDRIVER_INITIALIZE DriverInitializeRoutine, IN PKLDR_DATA_TABLE_ENTRY TableEntry, IN BOOLEAN IsFilter, OUT PDRIVER_OBJECT *DriverObject ); NTSTATUS IopInvalidateVolumesForDevice( IN PDEVICE_OBJECT DeviceObject ); BOOLEAN IopIsRemoteBootCard( IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PWCHAR HwIds ); NTSTATUS IopLoadDriver( IN HANDLE KeyHandle, IN BOOLEAN CheckForSafeBoot, IN BOOLEAN IsFilter, OUT NTSTATUS *DriverEntryStatus ); BOOLEAN IopMarkBootPartition( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); LOGICAL IopNotifyPnpWhenChainDereferenced( IN PDEVICE_OBJECT *PhysicalDeviceObjects, IN ULONG DeviceObjectCount, IN BOOLEAN Query, OUT PDEVICE_OBJECT *VetoingDevice ); VOID FORCEINLINE IopQueueThreadIrp( IN PIRP Irp ) /*++ Routine Description: This routine queues the specified I/O Request Packet (IRP) to the thread whose TCB address is stored in the packet. Arguments: Irp - Supplies the IRP to be queued for the specified thread. Return Value: None. --*/ { PETHREAD Thread; PLIST_ENTRY Head, Entry; Thread = Irp->Tail.Overlay.Thread; Head = &Thread->IrpList; Entry = &Irp->ThreadListEntry; KeEnterGuardedRegionThread (&Thread->Tcb); InsertHeadList( Head, Entry ); KeLeaveGuardedRegionThread (&Thread->Tcb); } PDRIVER_OBJECT IopReferenceDriverObjectByName ( IN PUNICODE_STRING DriverName ); BOOLEAN IopSafebootDriverLoad( PUNICODE_STRING DriverId ); NTSTATUS IopSetupRemoteBootCard( IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN HANDLE UniqueIdHandle, IN PUNICODE_STRING UnicodeDeviceInstance ); extern PVOID IopLoaderBlock; extern POBJECT_TYPE IoDriverObjectType; extern POBJECT_TYPE IoFileObjectType; // // Title Index to set registry key value // #define TITLE_INDEX_VALUE 0 //++ // // VOID // IopWstrToUnicodeString( // OUT PUNICODE_STRING u, // IN PCWSTR p // ) // //-- #define IopWstrToUnicodeString(u, p) \ \ (u)->Length = ((u)->MaximumLength = sizeof((p))) - sizeof(WCHAR); \ (u)->Buffer = (p) // // Remote Boot exports to PNP // NTSTATUS IopStartTcpIpForRemoteBoot ( PLOADER_PARAMETER_BLOCK LoaderBlock ); // // Remote Boot exports to IO // NTSTATUS IopAddRemoteBootValuesToRegistry ( PLOADER_PARAMETER_BLOCK LoaderBlock ); NTSTATUS IopStartNetworkForRemoteBoot ( PLOADER_PARAMETER_BLOCK LoaderBlock ); // // PNP Manager exports to IO // typedef struct _DEVICE_NODE DEVICE_NODE, *PDEVICE_NODE; VOID IopChainDereferenceComplete( IN PDEVICE_OBJECT PhysicalDeviceObject, IN BOOLEAN OnCleanStack ); NTSTATUS IopCreateRegistryKeyEx( OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL ); NTSTATUS IopInitializePlugPlayServices( IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN ULONG Phase ); NTSTATUS IopOpenRegistryKeyEx( OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess ); VOID IopDestroyDeviceNode( PDEVICE_NODE DeviceNode ); NTSTATUS IopDriverLoadingFailed( IN HANDLE KeyHandle OPTIONAL, IN PUNICODE_STRING KeyName OPTIONAL ); BOOLEAN IopInitializeBootDrivers( IN PLOADER_PARAMETER_BLOCK LoaderBlock, OUT PDRIVER_OBJECT *PreviousDriver ); BOOLEAN IopInitializeSystemDrivers( VOID ); BOOLEAN IopIsLegacyDriver ( IN PDRIVER_OBJECT DriverObject ); VOID IopMarkHalDeviceNode( VOID ); NTSTATUS IopPrepareDriverLoading( IN PUNICODE_STRING KeyName, IN HANDLE KeyHandle, IN PVOID ImageBase, IN BOOLEAN IsFilter ); NTSTATUS IopPnpDriverStarted( IN PDRIVER_OBJECT DriverObject, IN HANDLE KeyHandle, IN PUNICODE_STRING ServiceName ); NTSTATUS IopSynchronousCall( IN PDEVICE_OBJECT DeviceObject, IN PIO_STACK_LOCATION TopStackLocation, OUT PULONG_PTR Information ); NTSTATUS IopUnloadDriver( IN PUNICODE_STRING DriverServiceName, IN BOOLEAN InvokedByPnpMgr ); VOID IopIncrementDeviceObjectHandleCount( IN PDEVICE_OBJECT DeviceObject ); VOID IopDecrementDeviceObjectHandleCount( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS IopBuildFullDriverPath( IN PUNICODE_STRING KeyName, IN HANDLE KeyHandle, OUT PUNICODE_STRING FullPath ); #endif // _IOPCMN_