/* * winnt4.h * * Definitions only used in Windows NT 4.0 and earlier versions * * This file is part of the w32api package. * * Contributors: * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #ifndef __WINNT4_H #define __WINNT4_H #if __GNUC__ >=3 #pragma GCC system_header #endif #ifdef __cplusplus extern "C" { #endif typedef struct _ZONE_SEGMENT_HEADER { SINGLE_LIST_ENTRY SegmentList; PVOID Reserved; } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; typedef struct _ZONE_HEADER { SINGLE_LIST_ENTRY FreeList; SINGLE_LIST_ENTRY SegmentList; ULONG BlockSize; ULONG TotalSegmentSize; } ZONE_HEADER, *PZONE_HEADER; static __inline PVOID ExAllocateFromZone( IN PZONE_HEADER Zone) { if (Zone->FreeList.Next) Zone->FreeList.Next = Zone->FreeList.Next->Next; return (PVOID) Zone->FreeList.Next; } NTOSAPI NTSTATUS DDKAPI ExExtendZone( IN PZONE_HEADER Zone, IN PVOID Segment, IN ULONG SegmentSize); static __inline PVOID ExFreeToZone( IN PZONE_HEADER Zone, IN PVOID Block) { ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next; Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block); return ((PSINGLE_LIST_ENTRY) Block)->Next; } NTOSAPI NTSTATUS DDKAPI ExInitializeZone( IN PZONE_HEADER Zone, IN ULONG BlockSize, IN PVOID InitialSegment, IN ULONG InitialSegmentSize); /* * PVOID * ExInterlockedAllocateFromZone( * IN PZONE_HEADER Zone, * IN PKSPIN_LOCK Lock) */ #define ExInterlockedAllocateFromZone(Zone, \ Lock) \ ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock)) NTOSAPI NTSTATUS DDKAPI ExInterlockedExtendZone( IN PZONE_HEADER Zone, IN PVOID Segment, IN ULONG SegmentSize, IN PKSPIN_LOCK Lock); NTOSAPI PVOID DDKAPI ExInterlockedFreeToZone( IN PZONE_HEADER Zone, IN PVOID Block, IN PKSPIN_LOCK Lock); /* * VOID * ExInitializeWorkItem( * IN PWORK_QUEUE_ITEM Item, * IN PWORKER_THREAD_ROUTINE Routine, * IN PVOID Context) */ #define ExInitializeWorkItem(Item, \ Routine, \ Context) \ { \ (Item)->WorkerRoutine = Routine; \ (Item)->Parameter = Context; \ (Item)->List.Flink = NULL; \ } /* * BOOLEAN * ExIsFullZone( * IN PZONE_HEADER Zone) */ #define ExIsFullZone(Zone) \ ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL) NTOSAPI VOID DDKAPI ExQueueWorkItem( IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType); NTOSAPI BOOLEAN DDKAPI ExIsObjectInFirstZoneSegment( IN PZONE_HEADER Zone, IN PVOID Object); NTOSAPI VOID DDKAPI ExReleaseResource( IN PERESOURCE Resource); #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite #define ExAcquireResourceShared ExAcquireResourceSharedLite #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite #define ExDeleteResource ExDeleteResourceLite #define ExInitializeResource ExInitializeResourceLite #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite NTOSAPI INTERLOCKED_RESULT DDKAPI ExInterlockedDecrementLong( IN PLONG Addend, IN PKSPIN_LOCK Lock); NTOSAPI ULONG DDKAPI ExInterlockedExchangeUlong( IN PULONG Target, IN ULONG Value, IN PKSPIN_LOCK Lock); NTOSAPI INTERLOCKED_RESULT DDKAPI ExInterlockedIncrementLong( IN PLONG Addend, IN PKSPIN_LOCK Lock); NTOSAPI PVOID DDKAPI HalAllocateCommonBuffer( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, OUT PPHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled); NTOSAPI NTSTATUS DDKAPI HalAssignSlotResources( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources); NTOSAPI VOID DDKAPI HalFreeCommonBuffer( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled); NTOSAPI PADAPTER_OBJECT DDKAPI HalGetAdapter( IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters); NTOSAPI ULONG DDKAPI HalGetBusData( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Length); NTOSAPI ULONG DDKAPI HalGetBusDataByOffset( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length); NTOSAPI ULONG DDKAPI HalGetDmaAlignmentRequirement( VOID); NTOSAPI ULONG DDKAPI HalGetInterruptVector( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity); NTOSAPI ULONG DDKAPI HalReadDmaCounter( IN PADAPTER_OBJECT AdapterObject); NTOSAPI ULONG DDKAPI HalSetBusData( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Length); NTOSAPI ULONG DDKAPI HalSetBusDataByOffset( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length); NTOSAPI BOOLEAN DDKAPI HalTranslateBusAddress( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress); NTOSAPI NTSTATUS DDKAPI IoAllocateAdapterChannel( IN PADAPTER_OBJECT AdapterObject, IN PDEVICE_OBJECT DeviceObject, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context); NTOSAPI NTSTATUS DDKAPI IoAssignResources( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, IN OUT PCM_RESOURCE_LIST *AllocatedResources); NTOSAPI NTSTATUS DDKAPI IoAttachDeviceByPointer( IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice); NTOSAPI BOOLEAN DDKAPI IoFlushAdapterBuffers( IN PADAPTER_OBJECT AdapterObject, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN ULONG Length, IN BOOLEAN WriteToDevice); NTOSAPI VOID DDKAPI IoFreeAdapterChannel( IN PADAPTER_OBJECT AdapterObject); NTOSAPI VOID DDKAPI IoFreeMapRegisters( IN PADAPTER_OBJECT AdapterObject, IN PVOID MapRegisterBase, IN ULONG NumberOfMapRegisters); NTOSAPI PHYSICAL_ADDRESS DDKAPI IoMapTransfer( IN PADAPTER_OBJECT AdapterObject, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice); NTOSAPI PMDL DDKAPI MmCreateMdl( IN PMDL MemoryDescriptorList OPTIONAL, IN PVOID Base, IN SIZE_T Length); NTOSAPI BOOLEAN DDKAPI MmIsNonPagedSystemAddressValid( IN PVOID VirtualAddress); NTOSAPI LARGE_INTEGER DDKAPI RtlEnlargedIntegerMultiply( IN LONG Multiplicand, IN LONG Multiplier); NTOSAPI ULONG DDKAPI RtlEnlargedUnsignedDivide( IN ULARGE_INTEGER Dividend, IN ULONG Divisor, IN OUT PULONG Remainder); NTOSAPI LARGE_INTEGER DDKAPI RtlEnlargedUnsignedMultiply( IN ULONG Multiplicand, IN ULONG Multiplier); NTOSAPI LARGE_INTEGER DDKAPI RtlExtendedIntegerMultiply( IN LARGE_INTEGER Multiplicand, IN LONG Multiplier); NTOSAPI LARGE_INTEGER DDKAPI RtlExtendedLargeIntegerDivide( IN LARGE_INTEGER Dividend, IN ULONG Divisor, IN OUT PULONG Remainder); NTOSAPI LARGE_INTEGER DDKAPI RtlExtendedMagicDivide( IN LARGE_INTEGER Dividend, IN LARGE_INTEGER MagicDivisor, IN CCHAR ShiftCount); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerAdd( IN LARGE_INTEGER Addend1, IN LARGE_INTEGER Addend2); NTOSAPI VOID DDKAPI RtlLargeIntegerAnd( IN OUT LARGE_INTEGER Result, IN LARGE_INTEGER Source, IN LARGE_INTEGER Mask); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerArithmeticShift( IN LARGE_INTEGER LargeInteger, IN CCHAR ShiftCount); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerDivide( IN LARGE_INTEGER Dividend, IN LARGE_INTEGER Divisor, IN OUT PLARGE_INTEGER Remainder); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerEqualTo( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerEqualToZero( IN LARGE_INTEGER Operand); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerGreaterOrEqualToZero( IN LARGE_INTEGER Operand); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerGreaterThan( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerGreaterThanOrEqualTo( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerGreaterThanZero( IN LARGE_INTEGER Operand); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerLessOrEqualToZero( IN LARGE_INTEGER Operand); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerLessThan( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerLessThanOrEqualTo( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerLessThanZero( IN LARGE_INTEGER Operand); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerNegate( IN LARGE_INTEGER Subtrahend); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerNotEqualTo( IN LARGE_INTEGER Operand1, IN LARGE_INTEGER Operand2); NTOSAPI BOOLEAN DDKAPI RtlLargeIntegerNotEqualToZero( IN LARGE_INTEGER Operand); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerShiftLeft( IN LARGE_INTEGER LargeInteger, IN CCHAR ShiftCount); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerShiftRight( IN LARGE_INTEGER LargeInteger, IN CCHAR ShiftCount); NTOSAPI LARGE_INTEGER DDKAPI RtlLargeIntegerSubtract( IN LARGE_INTEGER Minuend, IN LARGE_INTEGER Subtrahend); /* * ULONG * COMPUTE_PAGES_SPANNED( * IN PVOID Va, * IN ULONG Size) */ #define COMPUTE_PAGES_SPANNED(Va, \ Size) \ (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size)) /* ** Architecture specific functions */ #ifdef _X86_ NTOSAPI INTERLOCKED_RESULT DDKAPI Exi386InterlockedIncrementLong( IN PLONG Addend); NTOSAPI INTERLOCKED_RESULT DDKFASTAPI Exfi386InterlockedIncrementLong( IN PLONG Addend); NTOSAPI INTERLOCKED_RESULT DDKAPI Exi386InterlockedDecrementLong( IN PLONG Addend); NTOSAPI INTERLOCKED_RESULT DDKFASTAPI Exfi386InterlockedDecrementLong( IN PLONG Addend); NTOSAPI ULONG DDKAPI Exi386InterlockedExchangeUlong( IN PULONG Target, IN ULONG Value); NTOSAPI ULONG DDKFASTAPI Exfi386InterlockedExchangeUlong( IN PULONG Target, IN ULONG Value); #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend) #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend) #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value) #endif /* _X86_ */ #ifdef __cplusplus } #endif #endif /* __WINNT4_H */