00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
#ifndef _IOP_
00025 
#define _IOP_
00026 
00027 
#ifndef FAR
00028 
#define FAR
00029 
#endif
00030 
00031 
#include "ntos.h"
00032 
#include "ntdddisk.h"
00033 
#include "ntddscsi.h"
00034 
#include "mountmgr.h"
00035 
#include "ntiodump.h"
00036 
#include "ntiolog.h"
00037 
#include "ntiologc.h"
00038 
#include "ntseapi.h"
00039 
#include "zwapi.h"
00040 
#include "stdio.h"
00041 
#include "stdlib.h"
00042 
#include "string.h"
00043 
#include "fsrtl.h"
00044 
#include "pnpiop.h"
00045 
#include "ioverifier.h"
00046 
00047 
#ifdef POOL_TAGGING
00048 
#undef ExAllocatePool
00049 
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'  oI')
00050 
#undef ExAllocatePoolWithQuota
00051 
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'  oI')
00052 
#endif
00053 
00054 
00055 
#include "safeboot.h"
00056 
00057 extern ULONG 
BreakDiskByteOffset;
00058 extern ULONG 
BreakPfn;
00059 
00060 
00061 
00062 
00063 
00064 
00065 #define IOP_ABORT                       1
00066 
00067 
00068 
00069 
00070 
00071 typedef enum _TRANSFER_TYPE {
00072     
ReadTransfer,
00073     
WriteTransfer,
00074     
OtherTransfer
00075 } 
TRANSFER_TYPE, *
PTRANSFER_TYPE;
00076 
00077 
00078 
00079 
00080 
00081 
00082 #define IOP_MAXIMUM_LOG_ALLOCATION PAGE_SIZE
00083 
00084 
00085 
00086 
00087 
00088 typedef struct _ERROR_LOG_ENTRY {
00089     USHORT Type;
00090     USHORT Size;
00091     LIST_ENTRY 
ListEntry;
00092     PDEVICE_OBJECT DeviceObject;
00093     PDRIVER_OBJECT DriverObject;
00094     LARGE_INTEGER 
TimeStamp;
00095 } 
ERROR_LOG_ENTRY, *
PERROR_LOG_ENTRY;
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 typedef struct _IOP_HARD_ERROR_QUEUE {
00104     WORK_QUEUE_ITEM ExWorkItem;
00105     LIST_ENTRY 
WorkQueue;
00106     KSPIN_LOCK 
WorkQueueSpinLock;
00107     KSEMAPHORE WorkQueueSemaphore;
00108     BOOLEAN 
ThreadStarted;
00109     ULONG   
NumPendingApcPopups;
00110 } 
IOP_HARD_ERROR_QUEUE, *
PIOP_HARD_ERROR_QUEUE;
00111 
00112 typedef struct _IOP_HARD_ERROR_PACKET {
00113     LIST_ENTRY 
WorkQueueLinks;
00114     NTSTATUS ErrorStatus;
00115     UNICODE_STRING 
String;
00116 } 
IOP_HARD_ERROR_PACKET, *
PIOP_HARD_ERROR_PACKET;
00117 
00118 typedef struct _IOP_APC_HARD_ERROR_PACKET {
00119     WORK_QUEUE_ITEM Item;
00120     PIRP Irp;
00121     PVPB Vpb;
00122     PDEVICE_OBJECT RealDeviceObject;
00123 } 
IOP_APC_HARD_ERROR_PACKET, *
PIOP_APC_HARD_ERROR_PACKET;
00124 
00125 
typedef
00126 
NTSTATUS
00127 (
FASTCALL *PIO_CALL_DRIVER) (
00128     IN 
PDEVICE_OBJECT DeviceObject,
00129     IN 
PIRP Irp
00130     );
00131 
00132 
typedef
00133 
VOID
00134 (
FASTCALL *PIO_COMPLETE_REQUEST) (
00135     IN 
PIRP Irp,
00136     IN CCHAR 
PriorityBoost
00137     );
00138 
00139 
typedef
00140 
VOID
00141 (*PIO_FREE_IRP) (
00142     IN 
struct _IRP *
Irp
00143     );
00144 
00145 
typedef
00146 
PIRP
00147 (*PIO_ALLOCATE_IRP) (
00148     IN CCHAR   StackSize,
00149     IN BOOLEAN ChargeQuota
00150     );
00151 
00152 extern IOP_HARD_ERROR_QUEUE IopHardError;
00153 extern PIOP_HARD_ERROR_PACKET IopCurrentHardError;
00154 
00155 #define IOP_MAXIMUM_OUTSTANDING_HARD_ERRORS 25
00156 
00157 typedef struct _IO_WORKITEM {
00158     WORK_QUEUE_ITEM WorkItem;
00159     PIO_WORKITEM_ROUTINE Routine;
00160     PDEVICE_OBJECT DeviceObject;
00161     PVOID 
Context;
00162 
#if DBG
00163 
    ULONG 
Size;
00164 
#endif
00165 
} 
IO_WORKITEM;
00166 
00167 
00168 
00169 
00170 
00171 extern WORK_QUEUE_ITEM IopErrorLogWorkItem;
00172 extern BOOLEAN 
IopErrorLogPortPending;
00173 extern BOOLEAN 
IopErrorLogDisabledThisBoot;
00174 extern KSPIN_LOCK 
IopErrorLogLock;
00175 extern LIST_ENTRY 
IopErrorLogListHead;
00176 extern ULONG 
IopErrorLogAllocation;
00177 extern KSPIN_LOCK 
IopErrorLogAllocationLock;
00178 extern KSPIN_LOCK 
IopCancelSpinLock;
00179 extern KSPIN_LOCK 
IopVpbSpinLock;
00180 extern GENERIC_MAPPING 
IopFileMapping;
00181 extern GENERIC_MAPPING 
IopCompletionMapping;
00182 
00183 
00184 
00185 
00186 
00187 typedef struct _DUMMY_FILE_OBJECT {
00188     OBJECT_HEADER ObjectHeader;
00189     CHAR FileObjectBody[ 
sizeof( 
FILE_OBJECT ) ];
00190 } 
DUMMY_FILE_OBJECT, *
PDUMMY_FILE_OBJECT;
00191 
00192 
00193 
00194 
00195 
00196 #define OPEN_PACKET_PATTERN  0xbeaa0251
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 typedef struct _OPEN_PACKET {
00206     CSHORT 
Type;
00207     CSHORT 
Size;
00208     PFILE_OBJECT FileObject;
00209     NTSTATUS FinalStatus;
00210     ULONG_PTR 
Information;
00211     ULONG 
ParseCheck;
00212     PFILE_OBJECT RelatedFileObject;
00213 
00214     
00215     
00216     
00217     
00218     
00219     
00220 
00221     LARGE_INTEGER 
AllocationSize;
00222     ULONG 
CreateOptions;
00223     USHORT FileAttributes;
00224     USHORT ShareAccess;
00225     PVOID 
EaBuffer;
00226     ULONG 
EaLength;
00227     ULONG 
Options;
00228     ULONG 
Disposition;
00229 
00230     
00231     
00232     
00233     
00234 
00235     PFILE_BASIC_INFORMATION 
BasicInformation;
00236 
00237     
00238     
00239     
00240     
00241 
00242     PFILE_NETWORK_OPEN_INFORMATION 
NetworkInformation;
00243 
00244     
00245     
00246     
00247 
00248     CREATE_FILE_TYPE CreateFileType;
00249 
00250     
00251     
00252     
00253     
00254     
00255 
00256     PVOID 
ExtraCreateParameters;
00257 
00258     
00259     
00260     
00261     
00262     
00263     
00264     
00265     
00266 
00267     BOOLEAN 
Override;
00268 
00269     
00270     
00271     
00272     
00273     
00274 
00275     BOOLEAN 
QueryOnly;
00276 
00277     
00278     
00279     
00280     
00281     
00282 
00283     BOOLEAN 
DeleteOnly;
00284 
00285     
00286     
00287     
00288     
00289     
00290 
00291     BOOLEAN 
FullAttributes;
00292 
00293     
00294     
00295     
00296     
00297     
00298     
00299 
00300     PDUMMY_FILE_OBJECT LocalFileObject;
00301 
00302 } 
OPEN_PACKET, *
POPEN_PACKET;
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 typedef struct _LOAD_PACKET {
00315     WORK_QUEUE_ITEM WorkQueueItem;
00316     KEVENT Event;
00317     PDRIVER_OBJECT DriverObject;
00318     PUNICODE_STRING 
DriverServiceName;
00319     NTSTATUS FinalStatus;
00320 } 
LOAD_PACKET, *
PLOAD_PACKET;
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 typedef struct _LINK_TRACKING_PACKET {
00329     WORK_QUEUE_ITEM WorkQueueItem;
00330     KEVENT Event;
00331     NTSTATUS FinalStatus;
00332 } 
LINK_TRACKING_PACKET, *
PLINK_TRACKING_PACKET;
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 typedef struct _REINIT_PACKET {
00342     LIST_ENTRY 
ListEntry;
00343     PDRIVER_OBJECT DriverObject;
00344     PDRIVER_REINITIALIZE DriverReinitializationRoutine;
00345     PVOID 
Context;
00346 } 
REINIT_PACKET, *
PREINIT_PACKET;
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 typedef struct _SHUTDOWN_PACKET {
00355     LIST_ENTRY 
ListEntry;
00356     PDEVICE_OBJECT DeviceObject;
00357 } 
SHUTDOWN_PACKET, *
PSHUTDOWN_PACKET;
00358 
00359 
00360 
00361 
00362 
00363 
00364 typedef struct _NOTIFICATION_PACKET {
00365     LIST_ENTRY 
ListEntry;
00366     PDRIVER_OBJECT DriverObject;
00367     PDRIVER_FS_NOTIFICATION NotificationRoutine;
00368 } 
NOTIFICATION_PACKET, *
PNOTIFICATION_PACKET;
00369 
00370 
00371 
00372 
00373 
00374 typedef enum _COMPLETION_PACKET_TYPE {
00375     
IopCompletionPacketIrp,
00376     
IopCompletionPacketMini,
00377     
IopCompletionPacketQuota
00378 } 
COMPLETION_PACKET_TYPE, *
PCOMPLETION_PACKET_TYPE;
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 typedef struct _IOP_MINI_COMPLETION_PACKET {
00387 
00388     
00389     
00390     
00391     
00392     
00393 
00394     
struct {
00395 
00396         
00397         
00398         
00399         
00400 
00401         LIST_ENTRY 
ListEntry;
00402 
00403         
union {
00404 
00405             
00406             
00407             
00408             
00409             
00410             
00411 
00412             struct _IO_STACK_LOCATION *
CurrentStackLocation;
00413 
00414             
00415             
00416             
00417 
00418             ULONG 
PacketType;
00419         };
00420     };
00421 
00422     PVOID 
KeyContext;
00423     PVOID 
ApcContext;
00424     NTSTATUS IoStatus;
00425     ULONG_PTR 
IoStatusInformation;
00426 } 
IOP_MINI_COMPLETION_PACKET, *
PIOP_MINI_COMPLETION_PACKET;
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 typedef struct _MINIPORT_NODE {
00435     LIST_ENTRY 
ListEntry;
00436     PLDR_DATA_TABLE_ENTRY 
DriverEntry;
00437     ULONG 
DriverChecksum;
00438 } 
MINIPORT_NODE, *
PMINIPORT_NODE;
00439 
00440 #define IO_TYPE_DCB                     0xff
00441 
00442 #define DCB_DUMP_ENABLED                 0x01
00443 #define DCB_SUMMARY_ENABLED              0x02
00444 #define DCB_AUTO_REBOOT                  0x04
00445 #define DCB_DUMP_HEADER_ENABLED          0x10
00446 #define DCB_SUMMARY_DUMP_ENABLED         0x20
00447 #define DCB_TRIAGE_DUMP_ENABLED          0x40
00448 #define DCB_TRIAGE_DUMP_ACT_UPON_ENABLED 0x80
00449 
00450 typedef struct _DUMP_CONTROL_BLOCK {
00451     UCHAR 
Type;
00452     CHAR Flags;
00453     USHORT Size;
00454     CCHAR 
NumberProcessors;
00455     CHAR Reserved;
00456     USHORT ProcessorArchitecture;
00457     PDUMP_STACK_CONTEXT DumpStack;
00458     PPHYSICAL_MEMORY_DESCRIPTOR MemoryDescriptor;
00459     ULONG 
MemoryDescriptorLength;
00460     PLARGE_INTEGER 
FileDescriptorArray;
00461     ULONG 
FileDescriptorSize;
00462     PULONG 
HeaderPage;
00463     PFN_NUMBER 
HeaderPfn;
00464     ULONG 
MajorVersion;
00465     ULONG 
MinorVersion;
00466     ULONG 
BuildNumber;
00467     CHAR VersionUser[32];
00468     ULONG 
HeaderSize;               
00469     LARGE_INTEGER 
DumpFileSize;     
00470     ULONG 
TriageDumpFlags;          
00471     PUCHAR 
TriageDumpBuffer;        
00472     ULONG 
TriageDumpBufferSize;     
00473 } 
DUMP_CONTROL_BLOCK, *
PDUMP_CONTROL_BLOCK;
00474 
00475 
00476 
00477 
00478 
00479 
00480 #define IOP_FIXED_SIZE_MDL_PFNS        0x17
00481 
00482 extern KSPIN_LOCK 
IopDatabaseLock;
00483 extern ERESOURCE IopDatabaseResource;
00484 extern ERESOURCE IopSecurityResource;
00485 extern LIST_ENTRY 
IopDiskFileSystemQueueHead;
00486 extern LIST_ENTRY 
IopCdRomFileSystemQueueHead;
00487 extern LIST_ENTRY 
IopNetworkFileSystemQueueHead;
00488 extern LIST_ENTRY 
IopTapeFileSystemQueueHead;
00489 extern LIST_ENTRY 
IopBootDriverReinitializeQueueHead;
00490 extern LIST_ENTRY 
IopDriverReinitializeQueueHead;
00491 extern LIST_ENTRY 
IopNotifyShutdownQueueHead;
00492 extern LIST_ENTRY 
IopNotifyLastChanceShutdownQueueHead;
00493 extern LIST_ENTRY 
IopFsNotifyChangeQueueHead;
00494 extern KSPIN_LOCK 
IoStatisticsLock;
00495 extern KSEMAPHORE IopRegistrySemaphore;
00496 extern KSPIN_LOCK 
IopTimerLock;
00497 extern LIST_ENTRY 
IopTimerQueueHead;
00498 extern KDPC IopTimerDpc;
00499 extern KTIMER IopTimer;
00500 extern ULONG 
IopTimerCount;
00501 extern ULONG 
IopLargeIrpStackLocations;
00502 extern KSPIN_LOCK 
IopCompletionLock;
00503 
00504 extern POBJECT_TYPE IoAdapterObjectType;
00505 extern POBJECT_TYPE IoCompletionObjectType;
00506 extern POBJECT_TYPE IoControllerObjectType;
00507 extern POBJECT_TYPE IoDeviceObjectType;
00508 extern POBJECT_TYPE IoDriverObjectType;
00509 extern POBJECT_TYPE IoDeviceHandlerObjectType;
00510 extern POBJECT_TYPE IoFileObjectType;
00511 extern ULONG        
IoDeviceHandlerObjectSize;
00512 
00513 extern NPAGED_LOOKASIDE_LIST IopLargeIrpLookasideList;
00514 extern NPAGED_LOOKASIDE_LIST IopSmallIrpLookasideList;
00515 extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
00516 extern NPAGED_LOOKASIDE_LIST IopCompletionLookasideList;
00517 
00518 extern UCHAR 
IopQueryOperationLength[];
00519 extern UCHAR 
IopSetOperationLength[];
00520 extern ULONG 
IopQueryOperationAccess[];
00521 extern ULONG 
IopSetOperationAccess[];
00522 extern UCHAR 
IopQuerySetAlignmentRequirement[];
00523 extern UCHAR 
IopQueryFsOperationLength[];
00524 extern UCHAR 
IopSetFsOperationLength[];
00525 extern ULONG 
IopQueryFsOperationAccess[];
00526 extern ULONG 
IopSetFsOperationAccess[];
00527 extern UCHAR 
IopQuerySetFsAlignmentRequirement[];
00528 
00529 extern UNICODE_STRING 
IoArcBootDeviceName;
00530 extern UNICODE_STRING 
IoArcHalDeviceName;
00531 extern PUCHAR 
IoLoaderArcBootDeviceName;
00532 extern PDUMP_CONTROL_BLOCK IopDumpControlBlock;
00533 extern ULONG 
IopDumpControlBlockChecksum;
00534 
00535 extern LONG 
IopUniqueDeviceObjectNumber;
00536 
00537 extern PVOID 
IopLinkTrackingServiceObject;
00538 extern PKEVENT IopLinkTrackingServiceEvent;
00539 extern KEVENT IopLinkTrackingPortObject;
00540 extern LINK_TRACKING_PACKET IopLinkTrackingPacket;
00541 
00542 extern PVOID 
IopLoaderBlock;
00543 
00544 extern BOOLEAN 
IopRemoteBootCardInitialized;
00545 
00546 extern ULONG 
IopLookasideIrpFloat;
00547 extern ULONG 
IopLookasideIrpLimit;
00548 extern BOOLEAN  
IopVerifierOn;
00549 
00550 extern PIO_CALL_DRIVER        
pIofCallDriver;
00551 extern PIO_COMPLETE_REQUEST   
pIofCompleteRequest;
00552 extern PIO_FREE_IRP           pIoFreeIrp;
00553 extern PIO_ALLOCATE_IRP       pIoAllocateIrp;
00554 
00555 
00556 
00557 
00558 
00559 
00560 
00561 extern POBJECT_TYPE ExEventObjectType;
00562 
00563 
00564 
00565 
00566 
00567 
VOID
00568 
IopAbortRequest(
00569     IN 
PKAPC Apc
00570     );
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591 
00592 
00593 
00594 
00595 #define IopAcquireFastLock( FileObject )    \
00596 
    ( InterlockedExchange( &FileObject->Busy, (ULONG) TRUE ) == FALSE )
00597 
00598 #define IopAcquireCancelSpinLockAtDpcLevel()    \
00599 
    ExAcquireSpinLockAtDpcLevel (&IopCancelSpinLock)
00600 
00601 #define IopReleaseCancelSpinLockFromDpcLevel()  \
00602 
    ExReleaseSpinLockFromDpcLevel (&IopCancelSpinLock)
00603 
00604 #define IopAllocateIrp(StackSize, ChargeQuota) \
00605 
        IoAllocateIrp((StackSize), (ChargeQuota))
00606 
00607 #define IsIoVerifierOn()    IopVerifierOn
00608 
00609 
00610 
NTSTATUS
00611 
IopAcquireFileObjectLock(
00612     IN 
PFILE_OBJECT FileObject,
00613     IN KPROCESSOR_MODE RequestorMode,
00614     IN BOOLEAN Alertable,
00615     OUT PBOOLEAN Interrupted
00616     );
00617 
00618 
00619 
VOID
00620 
IopAllocateIrpCleanup(
00621     IN 
PFILE_OBJECT FileObject,
00622     IN 
PKEVENT EventObject OPTIONAL
00623     );
00624 
00625 
PIRP
00626 
IopAllocateIrpMustSucceed(
00627     IN CCHAR StackSize
00628     );
00629 
00630 
VOID
00631 
IopApcHardError(
00632     IN PVOID StartContext
00633     );
00634 
00635 
VOID
00636 
IopCancelAlertedRequest(
00637     IN 
PKEVENT Event,
00638     IN 
PIRP Irp
00639     );
00640 
00641 
VOID
00642 
IopCheckBackupRestorePrivilege(
00643     IN 
PACCESS_STATE AccessState,
00644     IN OUT PULONG CreateOptions,
00645     IN KPROCESSOR_MODE PreviousMode,
00646     IN ULONG Disposition
00647     );
00648 
00649 
NTSTATUS
00650 
IopCheckGetQuotaBufferValidity(
00651     IN PFILE_GET_QUOTA_INFORMATION QuotaBuffer,
00652     IN ULONG QuotaLength,
00653     OUT PULONG_PTR ErrorOffset
00654     );
00655 
00656 
VOID
00657 
IopCloseFile(
00658     IN 
PEPROCESS Process OPTIONAL,
00659     IN PVOID Object,
00660     IN ULONG GrantedAccess,
00661     IN ULONG ProcessHandleCount,
00662     IN ULONG SystemHandleCount
00663     );
00664 
00665 
VOID
00666 
IopCompleteUnloadOrDelete(
00667     IN 
PDEVICE_OBJECT DeviceObject,
00668     IN KIRQL Irql
00669     );
00670 
00671 
VOID
00672 
IopCompletePageWrite(
00673     IN 
PKAPC Apc,
00674     IN PKNORMAL_ROUTINE *NormalRoutine,
00675     IN PVOID *NormalContext,
00676     IN PVOID *SystemArgument1,
00677     IN PVOID *SystemArgument2
00678     );
00679 
00680 
VOID
00681 
IopCompleteRequest(
00682     IN 
PKAPC Apc,
00683     IN PKNORMAL_ROUTINE *NormalRoutine,
00684     IN PVOID *NormalContext,
00685     IN PVOID *SystemArgument1,
00686     IN PVOID *SystemArgument2
00687     );
00688 
00689 
VOID
00690 
IopConnectLinkTrackingPort(
00691     IN PVOID Parameter
00692     );
00693 
00694 
VOID
00695 
IopCreateVpb (
00696     IN 
PDEVICE_OBJECT DeviceObject
00697     );
00698 
00699 
VOID
00700 
IopDeallocateApc(
00701     IN 
PKAPC Apc,
00702     IN PKNORMAL_ROUTINE *NormalRoutine,
00703     IN PVOID *NormalContext,
00704     IN PVOID *SystemArgument1,
00705     IN PVOID *SystemArgument2
00706     );
00707 
00708 
VOID
00709 
IopDecrementDeviceObjectRef(
00710     IN 
PDEVICE_OBJECT DeviceObject,
00711     IN BOOLEAN AlwaysUnload
00712     );
00713 
00714 
VOID
00715 
IopDeleteDriver(
00716     IN PVOID Object
00717     );
00718 
00719 
VOID
00720 
IopDeleteDevice(
00721     IN PVOID Object
00722     );
00723 
00724 
VOID
00725 
IopDeleteFile(
00726     IN PVOID Object
00727     );
00728 
00729 
VOID
00730 
IopDeleteIoCompletion(
00731     IN PVOID Object
00732     );
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
00745 
00746 
00747 
00748 
00749 
00750 
00751 
00752 
00753 
00754 
00755 
00756 
00757 
00758 #define IopDequeueThreadIrp( Irp ) \
00759 
   { \
00760 
   RemoveEntryList( &Irp->ThreadListEntry ); \
00761 
   InitializeListHead( &Irp->ThreadListEntry ) ; \
00762 
   }
00763 
00764 
00765 
#ifdef  _WIN64
00766 
#define IopApcRoutinePresent(ApcRoutine)    ARGUMENT_PRESENT((ULONG_PTR)(ApcRoutine) & ~1)
00767 
#else
00768 #define IopApcRoutinePresent(ApcRoutine)    ARGUMENT_PRESENT(ApcRoutine)
00769 
#endif
00770 
00771 
VOID
00772 
IopDisassociateThreadIrp(
00773     VOID
00774     );
00775 
00776 BOOLEAN
00777 
IopDmaDispatch(
00778     IN 
PKINTERRUPT Interrupt,
00779     IN PVOID ServiceContext
00780     );
00781 
00782 
VOID
00783 
IopDropIrp(
00784     IN 
PIRP Irp,
00785     IN 
PFILE_OBJECT FileObject
00786     );
00787 
00788 LONG
00789 
IopExceptionFilter(
00790     IN PEXCEPTION_POINTERS ExceptionPointers,
00791     OUT PNTSTATUS ExceptionCode
00792     );
00793 
00794 
VOID
00795 
IopExceptionCleanup(
00796     IN 
PFILE_OBJECT FileObject,
00797     IN 
PIRP Irp,
00798     IN 
PKEVENT EventObject OPTIONAL,
00799     IN 
PKEVENT KernelEvent OPTIONAL
00800     );
00801 
00802 
VOID
00803 
IopErrorLogThread(
00804     IN PVOID StartContext
00805     );
00806 
00807 
VOID
00808 
IopFreeIrpAndMdls(
00809     IN 
PIRP Irp
00810     );
00811 
00812 
PDEVICE_OBJECT
00813 
IopGetDeviceAttachmentBase(
00814     IN 
PDEVICE_OBJECT DeviceObject
00815     );
00816 
00817 
PDEVICE_OBJECT
00818 
IopGetDeviceAttachmentBaseRef(
00819     IN 
PDEVICE_OBJECT DeviceObject
00820     );
00821 
00822 
NTSTATUS
00823 
IopGetDriverNameFromKeyNode(
00824     IN HANDLE KeyHandle,
00825     OUT PUNICODE_STRING DriverName
00826     );
00827 
00828 ULONG
00829 
IopGetDumpControlBlockCheck (
00830     IN PDUMP_CONTROL_BLOCK  Dcb
00831     );
00832 
00833 
NTSTATUS
00834 
IopGetFileName(
00835     IN 
PFILE_OBJECT FileObject,
00836     IN ULONG Length,
00837     OUT PVOID FileInformation,
00838     OUT PULONG ReturnedLength
00839     );
00840 
00841 BOOLEAN
00842 
IopGetMountFlag(
00843     IN 
PDEVICE_OBJECT DeviceObject
00844     );
00845 
00846 
NTSTATUS
00847 
IopGetRegistryKeyInformation(
00848     IN HANDLE KeyHandle,
00849     OUT PKEY_FULL_INFORMATION *Information
00850     );
00851 
00852 
NTSTATUS
00853 
IopGetRegistryValue(
00854     IN HANDLE KeyHandle,
00855     IN PWSTR  ValueName,
00856     OUT PKEY_VALUE_FULL_INFORMATION *Information
00857     );
00858 
00859 
NTSTATUS
00860 
IopGetRegistryValues(
00861     IN HANDLE KeyHandle,
00862     IN PKEY_VALUE_FULL_INFORMATION *ValueList
00863     );
00864 
00865 
NTSTATUS
00866 
IopGetRegistryValues(
00867     IN HANDLE KeyHandle,
00868     IN PKEY_VALUE_FULL_INFORMATION *ValueList
00869     );
00870 
00871 
NTSTATUS
00872 
IopGetSetObjectId(
00873     IN 
PFILE_OBJECT FileObject,
00874     IN OUT PVOID Buffer,
00875     IN ULONG Length,
00876     IN ULONG OperationFlags
00877     );
00878 
00879 
NTSTATUS
00880 
IopGetSetSecurityObject(
00881     IN PVOID Object,
00882     IN SECURITY_OPERATION_CODE OperationCode,
00883     IN PSECURITY_INFORMATION SecurityInformation,
00884     IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
00885     IN OUT PULONG CapturedLength,
00886     IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
00887     IN POOL_TYPE PoolType,
00888     IN PGENERIC_MAPPING GenericMapping
00889     );
00890 
00891 
NTSTATUS
00892 
IopGetVolumeId(
00893     IN 
PFILE_OBJECT FileObject,
00894     IN OUT PLINK_TRACKING_INFORMATION ObjectId,
00895     IN ULONG Length
00896     );
00897 
00898 
VOID
00899 
IopHardErrorThread(
00900     PVOID StartContext
00901     );
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 
00917 
00918 
00919 
00920 
00921 
00922 
00923 
00924 
00925 
00926 
00927 
00928 
00929 
00930 #define IopInitializeIrp( Irp, PacketSize, StackSize ) {          \
00931 
    RtlZeroMemory( (Irp), (PacketSize) );                         \
00932 
    (Irp)->Type = (CSHORT) IO_TYPE_IRP;                           \
00933 
    (Irp)->Size = (USHORT) ((PacketSize));                        \
00934 
    (Irp)->StackCount = (CCHAR) ((StackSize));                    \
00935 
    (Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1);           \
00936 
    (Irp)->ApcEnvironment = KeGetCurrentApcEnvironment();         \
00937 
    InitializeListHead (&(Irp)->ThreadListEntry);                 \
00938 
    (Irp)->Tail.Overlay.CurrentStackLocation =                    \
00939 
        ((PIO_STACK_LOCATION) ((UCHAR *) (Irp) +                  \
00940 
            sizeof( IRP ) +                                       \
00941 
            ( (StackSize) * sizeof( IO_STACK_LOCATION )))); }
00942 
00943 
VOID
00944 
IopInitializeResourceMap (
00945     
PLOADER_PARAMETER_BLOCK LoaderBlock
00946     );
00947 
00948 
VOID
00949 
IopInsertRemoveDevice(
00950     IN 
PDRIVER_OBJECT DriverObject,
00951     IN 
PDEVICE_OBJECT DeviceObject,
00952     IN BOOLEAN Insert
00953     );
00954 
00955 
NTSTATUS
00956 
IopInvalidDeviceRequest(
00957     IN 
PDEVICE_OBJECT DeviceObject,
00958     IN 
PIRP Irp
00959     );
00960 
00961 
NTSTATUS
00962 
IopInvalidateVolumesForDevice(
00963     IN 
PDEVICE_OBJECT DeviceObject
00964     );
00965 
00966 BOOLEAN
00967 
IopIsSameMachine(
00968     IN 
PFILE_OBJECT SourceFile,
00969     IN HANDLE TargetFile
00970     );
00971 
00972 
NTSTATUS
00973 
IopLoadDriver(
00974     IN HANDLE KeyHandle,
00975     IN BOOLEAN CheckForSafeBoot
00976     );
00977 
00978 
VOID
00979 
IopLoadFileSystemDriver(
00980     IN 
PDEVICE_OBJECT DeviceObject
00981     );
00982 
00983 
VOID
00984 
IopLoadUnloadDriver(
00985     IN PVOID Parameter
00986     );
00987 
00988 
NTSTATUS
00989 
IopLookupBusStringFromID (
00990     IN  HANDLE KeyHandle,
00991     IN  INTERFACE_TYPE InterfaceType,
00992     OUT PWCHAR Buffer,
00993     IN  ULONG Length,
00994     OUT PULONG BusFlags OPTIONAL
00995     );
00996 
00997 
NTSTATUS
00998 
IopMountVolume(
00999     IN 
PDEVICE_OBJECT DeviceObject,
01000     IN BOOLEAN AllowRawMount,
01001     IN BOOLEAN DeviceLockAlreadyHeld,
01002     IN BOOLEAN Alertable
01003     );
01004 
01005 BOOLEAN
01006 
IopNotifyPnpWhenChainDereferenced(
01007     IN 
PDEVICE_OBJECT *PhysicalDeviceObjects,
01008     IN ULONG DeviceObjectCount,
01009     IN BOOLEAN Query,
01010     OUT 
PDEVICE_OBJECT *VetoingDevice
01011     );
01012 
01013 
NTSTATUS
01014 
IopOpenLinkOrRenameTarget(
01015     OUT PHANDLE TargetHandle,
01016     IN 
PIRP Irp,
01017     IN PVOID RenameBuffer,
01018     IN 
PFILE_OBJECT FileObject
01019     );
01020 
01021 
NTSTATUS
01022 
IopOpenRegistryKey(
01023     OUT PHANDLE Handle,
01024     IN HANDLE BaseHandle OPTIONAL,
01025     IN PUNICODE_STRING KeyName,
01026     IN ACCESS_MASK DesiredAccess,
01027     IN BOOLEAN Create
01028     );
01029 
01030 
NTSTATUS
01031 
IopParseDevice(
01032     IN PVOID ParseObject,
01033     IN PVOID ObjectType,
01034     IN 
PACCESS_STATE AccessState,
01035     IN KPROCESSOR_MODE AccessMode,
01036     IN ULONG Attributes,
01037     IN OUT PUNICODE_STRING CompleteName,
01038     IN OUT PUNICODE_STRING RemainingName,
01039     IN OUT PVOID Context OPTIONAL,
01040     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
01041     OUT PVOID *Object
01042     );
01043 
01044 
NTSTATUS
01045 
IopParseFile(
01046     IN PVOID ParseObject,
01047     IN PVOID ObjectType,
01048     IN 
PACCESS_STATE AccessState,
01049     IN KPROCESSOR_MODE AccessMode,
01050     IN ULONG Attributes,
01051     IN OUT PUNICODE_STRING CompleteName,
01052     IN OUT PUNICODE_STRING RemainingName,
01053     IN OUT PVOID Context OPTIONAL,
01054     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
01055     OUT PVOID *Object
01056     );
01057 
01058 BOOLEAN
01059 
IopProtectSystemPartition(
01060     IN 
PLOADER_PARAMETER_BLOCK LoaderBlock
01061     );
01062 
01063 
NTSTATUS
01064 
IopQueryName(
01065     IN PVOID Object,
01066     IN BOOLEAN HasObjectName,
01067     OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
01068     IN ULONG Length,
01069     OUT PULONG ReturnLength
01070     );
01071 
01072 
NTSTATUS
01073 
IopQueryXxxInformation(
01074     IN 
PFILE_OBJECT FileObject,
01075     IN ULONG InformationClass,
01076     IN ULONG Length,
01077     OUT PVOID Information,
01078     OUT PULONG ReturnedLength,
01079     IN BOOLEAN FileInformation
01080     );
01081 
01082 
01083 
01084 
01085 
01086 
01087 
01088 
01089 
01090 
01091 
01092 
01093 
01094 
01095 
01096 
01097 
01098 
01099 
01100 
01101 
01102 
01103 #define IopQueueThreadIrp( Irp ) {                      \
01104 
    KIRQL irql;                                         \
01105 
    KeRaiseIrql( APC_LEVEL, &irql );                    \
01106 
    InsertHeadList( &Irp->Tail.Overlay.Thread->IrpList, \
01107 
                    &Irp->ThreadListEntry );            \
01108 
    KeLowerIrql( irql );                                \
01109 
    }
01110 
01111 
VOID
01112 
IopQueueWorkRequest(
01113     IN 
PIRP Irp
01114     );
01115 
01116 
VOID
01117 
IopRaiseHardError(
01118     IN PVOID NormalContext,
01119     IN PVOID SystemArgument1,
01120     IN PVOID SystemArgument2
01121     );
01122 
01123 
VOID
01124 
IopRaiseInformationalHardError(
01125     IN PVOID NormalContext,
01126     IN PVOID SystemArgument1,
01127     IN PVOID SystemArgument2
01128     );
01129 
01130 
VOID
01131 
IopReadyDeviceObjects(
01132     IN 
PDRIVER_OBJECT DriverObject
01133     );
01134 
01135 
01136 
01137 
01138 
01139 
01140 
01141 
01142 
01143 
01144 
01145 
01146 
01147 
01148 
01149 
01150 
01151 
01152 
01153 
01154 
01155 
01156 
01157 #define IopReleaseFileObjectLock( FileObject ) {    \
01158 
    ULONG Result;                                   \
01159 
    Result = InterlockedExchange( &FileObject->Busy, FALSE ); \
01160 
    ASSERT(Result != FALSE);                        \
01161 
    if (FileObject->Waiters != 0) {                 \
01162 
        KeSetEvent( &FileObject->Lock, 0, FALSE );  \
01163 
    }                                               \
01164 
}
01165 
01166 
#if _WIN32_WINNT >= 0x0500
01167 
NTSTATUS
01168 
IopSendMessageToTrackService(
01169     IN PLINK_TRACKING_INFORMATION SourceVolumeId,
01170     IN PFILE_OBJECTID_BUFFER SourceObjectId,
01171     IN PFILE_TRACKING_INFORMATION TargetObjectInformation
01172     );
01173 
#endif
01174 
01175 
NTSTATUS
01176 
IopSetEaOrQuotaInformationFile(
01177     IN HANDLE FileHandle,
01178     OUT PIO_STATUS_BLOCK IoStatusBlock,
01179     IN PVOID Buffer,
01180     IN ULONG Length,
01181     IN BOOLEAN SetEa
01182     );
01183 
01184 
NTSTATUS
01185 
IopSetRemoteLink(
01186     IN 
PFILE_OBJECT FileObject,
01187     IN 
PFILE_OBJECT DestinationFileObject OPTIONAL,
01188     IN PFILE_TRACKING_INFORMATION FileInformation OPTIONAL
01189     );
01190 
01191 
VOID
01192 
IopStartApcHardError(
01193     IN PVOID StartContext
01194     );
01195 
01196 
NTSTATUS
01197 
IopSynchronousApiServiceTail(
01198     IN NTSTATUS ReturnedStatus,
01199     IN 
PKEVENT Event,
01200     IN 
PIRP Irp,
01201     IN KPROCESSOR_MODE RequestorMode,
01202     IN PIO_STATUS_BLOCK LocalIoStatus,
01203     OUT PIO_STATUS_BLOCK IoStatusBlock
01204     );
01205 
01206 
NTSTATUS
01207 
IopSynchronousServiceTail(
01208     IN 
PDEVICE_OBJECT DeviceObject,
01209     IN 
PIRP Irp,
01210     IN 
PFILE_OBJECT FileObject,
01211     IN BOOLEAN DeferredIoCompletion,
01212     IN KPROCESSOR_MODE RequestorMode,
01213     IN BOOLEAN SynchronousIo,
01214     IN TRANSFER_TYPE TransferType
01215     );
01216 
01217 
VOID
01218 
IopTimerDispatch(
01219     IN 
PKDPC Dpc,
01220     IN PVOID DeferredContext,
01221     IN PVOID SystemArgument1,
01222     IN PVOID SystemArgument2
01223     );
01224 
01225 
NTSTATUS
01226 
IopTrackLink(
01227     IN 
PFILE_OBJECT FileObject,
01228     IN OUT PIO_STATUS_BLOCK IoStatusBlock,
01229     IN PFILE_TRACKING_INFORMATION FileInformation,
01230     IN ULONG Length,
01231     IN 
PKEVENT Event,
01232     IN KPROCESSOR_MODE RequestorMode
01233     );
01234 
01235 
01236 
VOID
01237 
IopUserCompletion(
01238     IN 
PKAPC Apc,
01239     IN PKNORMAL_ROUTINE *NormalRoutine,
01240     IN PVOID *NormalContext,
01241     IN PVOID *SystemArgument1,
01242     IN PVOID *SystemArgument2
01243     );
01244 
01245 
NTSTATUS
01246 
IopXxxControlFile(
01247     IN HANDLE FileHandle,
01248     IN HANDLE Event OPTIONAL,
01249     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
01250     IN PVOID ApcContext OPTIONAL,
01251     OUT PIO_STATUS_BLOCK IoStatusBlock,
01252     IN ULONG IoControlCode,
01253     IN PVOID InputBuffer OPTIONAL,
01254     IN ULONG InputBufferLength,
01255     OUT PVOID OutputBuffer OPTIONAL,
01256     IN ULONG OutputBufferLength,
01257     IN BOOLEAN DeviceIoControl
01258     );
01259 
01260 
NTSTATUS
01261 
IopReportResourceUsage(
01262     IN PUNICODE_STRING DriverClassName OPTIONAL,
01263     IN 
PDRIVER_OBJECT DriverObject,
01264     IN PCM_RESOURCE_LIST DriverList OPTIONAL,
01265     IN ULONG DriverListSize OPTIONAL,
01266     IN 
PDEVICE_OBJECT DeviceObject OPTIONAL,
01267     IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
01268     IN ULONG DeviceListSize OPTIONAL,
01269     IN BOOLEAN OverrideConflict,
01270     OUT PBOOLEAN ConflictDetected
01271     );
01272 
01273 
NTSTATUS
01274 
IopAddRemoteBootValuesToRegistry (
01275     
PLOADER_PARAMETER_BLOCK LoaderBlock
01276     );
01277 
01278 
NTSTATUS
01279 
IopStartNetworkForRemoteBoot (
01280     
PLOADER_PARAMETER_BLOCK LoaderBlock
01281     );
01282 
01283 
#if defined(REMOTE_BOOT)
01284 
VOID
01285 IopShutdownCsc (
01286     VOID
01287     );
01288 
#endif
01289 
01290 
NTSTATUS
01291 
IopStartTcpIpForRemoteBoot (
01292     
PLOADER_PARAMETER_BLOCK LoaderBlock
01293     );
01294 
01295 BOOLEAN
01296 
IopIsRemoteBootCard(
01297     IN 
PDEVICE_NODE DeviceNode,
01298     IN 
PLOADER_PARAMETER_BLOCK LoaderBlock,
01299     IN PWCHAR HwIds
01300     );
01301 
01302 
NTSTATUS
01303 
IopSetupRemoteBootCard(
01304     IN 
PLOADER_PARAMETER_BLOCK LoaderBlock,
01305     IN HANDLE UniqueIdHandle,
01306     IN PUNICODE_STRING UnicodeDeviceInstance
01307     );
01308 
01309 BOOLEAN
01310 
IopSafebootDriverLoad(
01311     PUNICODE_STRING DriverId
01312     );
01313 
01314 PSECURITY_DESCRIPTOR
01315 
IopCreateDefaultDeviceSecurityDescriptor(
01316     IN DEVICE_TYPE DeviceType,
01317     IN ULONG DeviceCharacteristics,
01318     IN BOOLEAN DeviceHasName,
01319     IN PUCHAR Buffer,
01320     OUT PACL *AllocatedAcl,
01321     OUT PSECURITY_INFORMATION SecurityInformation OPTIONAL
01322     );
01323 
01324 
VOID
01325 
IopDoNameTransmogrify(
01326     IN 
PIRP Irp,
01327     IN 
PFILE_OBJECT FileObject,
01328     IN PREPARSE_DATA_BUFFER ReparseBuffer
01329     );
01330 
01331 
NTSTATUS
01332 
IopQueryDeviceCapabilities(
01333     IN 
PDEVICE_NODE DeviceNode,
01334     OUT 
PDEVICE_CAPABILITIES Capabilities
01335     );
01336 
01337 
01338 
01339 
01340 
01341 
NTSTATUS
01342 
IopLogErrorEvent(
01343     IN ULONG            SequenceNumber,
01344     IN ULONG            UniqueErrorValue,
01345     IN NTSTATUS         FinalStatus,
01346     IN NTSTATUS         SpecificIOStatus,
01347     IN ULONG            LengthOfInsert1,
01348     IN PWCHAR           Insert1,
01349     IN ULONG            LengthOfInsert2,
01350     IN PWCHAR           Insert2
01351     );
01352 
01353 BOOLEAN
01354 
IopConfigureCrashDump(
01355     IN HANDLE HandlePagingFile
01356     );
01357 
01358 
VOID
01359 
IopUpdateOtherOperationCount(
01360     VOID
01361     );
01362 
01363 
VOID
01364 
IopUpdateReadOperationCount(
01365     VOID
01366     );
01367 
01368 
VOID
01369 
IopUpdateWriteOperationCount(
01370     VOID
01371     );
01372 
01373 
VOID
01374 
IopUpdateOtherTransferCount(
01375     IN ULONG TransferCount
01376     );
01377 
01378 
VOID
01379 
IopUpdateReadTransferCount(
01380     IN ULONG TransferCount
01381     );
01382 
01383 
VOID
01384 
IopUpdateWriteTransferCount(
01385     IN ULONG TransferCount
01386     );
01387 
01388 
NTSTATUS
01389 
FASTCALL
01390 
IopfCallDriver(
01391     
PDEVICE_OBJECT  DeviceObject,
01392     
PIRP            Irp
01393     );
01394 
01395 
VOID
01396 
FASTCALL
01397 
IopfCompleteRequest(
01398     IN  
PIRP    Irp,
01399     IN  CCHAR   PriorityBost
01400     );
01401 
01402 
01403 
PIRP
01404 
IopAllocateIrpPrivate(
01405     IN  CCHAR   StackSize,
01406     IN  BOOLEAN ChargeQuota
01407     );
01408 
01409 
VOID
01410 
IopFreeIrp(
01411     IN  
PIRP    Irp
01412     );
01413 
01414 PVOID
01415 
IopAllocateErrorLogEntry(
01416     IN 
PDEVICE_OBJECT deviceObject,
01417     IN 
PDRIVER_OBJECT driverObject,
01418     IN UCHAR EntrySize
01419     );
01420 
#endif // _IOP_