typedef struct _IRP
{
    short Type;
    unsigned short Size;
    MDL *MdlAddress;
    unsigned long Flags;
    union
    {
        IRP *MasterIrp;
        long IrpCount;
        void *SystemBuffer;
    } AssociatedIrp;
    LIST_ENTRY ThreadListEntry;
    IO_STATUS_BLOCK IoStatus;
    char RequestorMode;
    unsigned char PendingReturned;
    char StackCount;
    char CurrentLocation;
    unsigned char Cancel;
    unsigned char CancelIrql;
    char ApcEnvironment;
    unsigned char AllocationFlags;
    IO_STATUS_BLOCK *UserIosb;
    KEVENT *UserEvent;
    union
    {
        struct
        {
            union
            {
                void (*UserApcRoutine)(void *, IO_STATUS_BLOCK *, unsigned long);
                void *IssuingProcess;
            };
            void *UserApcContext;
        } AsynchronousParameters;
        LARGE_INTEGER AllocationSize;
    } Overlay;
    void (*CancelRoutine)(DEVICE_OBJECT *, IRP *);
    void *UserBuffer;
    union
    {
        struct
        {
            union
            {
                KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
                void *DriverContext[4];
            };
            ETHREAD *Thread;
            char *AuxiliaryBuffer;
            LIST_ENTRY ListEntry;
            union
            {
                IO_STACK_LOCATION *CurrentStackLocation;
                unsigned long PacketType;
            };
            FILE_OBJECT *OriginalFileObject;
        } Overlay;
        KAPC Apc;
        void *CompletionKey;
    } Tail;
} IRP, *PIRP;