IrpCreateFile

基于强化学习框架的交易策略学习过程 每个状态s∈S 是一个由六个微观结构特征构成的向量,这些特征反映了当前市场的订单簿状态和近期交易行为。 阅读详情
  1. #include <ntddk.h>  
  2. #include "ioctl.h"  
  3. #include "wintypes.h"  
  4. //---------------------------------------------------------------------------   
  5.   
  6. #ifdef _DEBUG   
  7. #define DbgPrint(_string) {DbgPrint _string;}   
  8. #else  
  9. #define DbgPrint(_string)   
  10. #endif   
  11. //---------------------------------------------------------------------------   
  12.   
  13. NTSTATUS   
  14. IoCompletionRoutine(   
  15.         IN PDEVICE_OBJECT  DeviceObject,   
  16.         IN PIRP  Irp,   
  17.         IN PVOID  Context   
  18.         )   
  19. {   
  20.         DbgPrint(("IoCompletionRoutine!/n"));   
  21.         *Irp->UserIosb = Irp->IoStatus;   
  22.   
  23.         if (Irp->UserEvent)   
  24.                 KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, 0);   
  25.   
  26.         if (Irp->MdlAddress)   
  27.         {   
  28.                 IoFreeMdl(Irp->MdlAddress);   
  29.                 Irp->MdlAddress = NULL;   
  30.         }   
  31.   
  32.         IoFreeIrp(Irp);   
  33.   
  34.         return STATUS_MORE_PROCESSING_REQUIRED;   
  35. }   
  36.   
  37. NTSTATUS   
  38. IrpFileCreate(   
  39.         IN PUNICODE_STRING FileName,   
  40.         IN ACCESS_MASK DesiredAccess,   
  41.         IN ULONG FileAttributes,   
  42.         IN ULONG ShareAccess,   
  43.         IN ULONG CreateDisposition,   
  44.         IN ULONG CreateOptions,   
  45.         IN PDEVICE_OBJECT DeviceObject,   
  46.         IN PDEVICE_OBJECT RealDevice,   
  47.         OUT PVOID *Object   
  48.         )   
  49. {   
  50.         NTSTATUS status;   
  51.         KEVENT event;   
  52.         PIRP irp;   
  53.         IO_STATUS_BLOCK ioStatus;   
  54.         PIO_STACK_LOCATION irpSp;   
  55.         IO_SECURITY_CONTEXT securityContext;   
  56.         ACCESS_STATE accessState;   
  57.         OBJECT_ATTRIBUTES objectAttributes;   
  58.         PFILE_OBJECT fileObject;   
  59.         AUX_ACCESS_DATA auxData;   
  60.   
  61.         RtlZeroMemory(&auxData, sizeof(AUX_ACCESS_DATA));   
  62.         KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  63.         irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);   
  64.   
  65.         if (irp == NULL)   
  66.                 return STATUS_INSUFFICIENT_RESOURCES;   
  67.   
  68.         InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE, 0, NULL);   
  69.   
  70.         status = ObCreateObject(KernelMode,   
  71.                                                         *IoFileObjectType,   
  72.                                                         &objectAttributes,   
  73.                                                         KernelMode,   
  74.                                                         NULL,   
  75.                                                         sizeof(FILE_OBJECT),   
  76.                                                         0,   
  77.                                                         0,   
  78.                                                         (PVOID *)&fileObject);   
  79.   
  80.         if (!NT_SUCCESS(status))   
  81.         {   
  82.                 IoFreeIrp(irp);   
  83.                 return status;   
  84.         }   
  85.   
  86.         RtlZeroMemory(fileObject, sizeof(FILE_OBJECT));   
  87.         fileObject->Type = IO_TYPE_FILE;   
  88.         fileObject->Size = sizeof(FILE_OBJECT);   
  89.         fileObject->DeviceObject = RealDevice;   
  90. //        fileObject->RelatedFileObject = NULL;   
  91.         fileObject->Flags = FO_SYNCHRONOUS_IO;   
  92.         fileObject->FileName.MaximumLength = FileName->MaximumLength;   
  93.         fileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, FileName->MaximumLength);   
  94.   
  95.         if (fileObject->FileName.Buffer == NULL)   
  96.         {   
  97.                 IoFreeIrp(irp);   
  98.                 ObDereferenceObject(fileObject);   
  99.                 return STATUS_INSUFFICIENT_RESOURCES;   
  100.         }   
  101.   
  102.         RtlCopyUnicodeString(&fileObject->FileName, FileName);   
  103.         KeInitializeEvent(&fileObject->Lock, SynchronizationEvent, FALSE);   
  104.         KeInitializeEvent(&fileObject->Event, NotificationEvent, FALSE);   
  105.   
  106.         irp->MdlAddress = NULL;   
  107.         irp->Flags |= IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API;   
  108.         irp->RequestorMode = KernelMode;   
  109.         irp->UserIosb = &ioStatus;   
  110.         irp->UserEvent = &event;   
  111.         irp->PendingReturned = FALSE;   
  112.         irp->Cancel = FALSE;   
  113.         irp->CancelRoutine = NULL;   
  114.         irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();   
  115.         irp->Tail.Overlay.AuxiliaryBuffer = NULL;   
  116.         irp->Tail.Overlay.OriginalFileObject = fileObject;   
  117.   
  118.         status = SeCreateAccessState(        &accessState,   
  119.                                                                         &auxData,   
  120.                                                                         DesiredAccess,   
  121.                                                                         IoGetFileObjectGenericMapping());   
  122.   
  123.         if (!NT_SUCCESS(status))   
  124.         {   
  125.                 IoFreeIrp(irp);   
  126.                 ExFreePool(fileObject->FileName.Buffer);   
  127.                 ObDereferenceObject(fileObject);   
  128.                 return status;   
  129.         }   
  130.   
  131.         securityContext.SecurityQos = NULL;   
  132.         securityContext.AccessState = &accessState;   
  133.         securityContext.DesiredAccess = DesiredAccess;   
  134.         securityContext.FullCreateOptions = 0;   
  135.   
  136.         irpSp = IoGetNextIrpStackLocation(irp);   
  137.         irpSp->MajorFunction = IRP_MJ_CREATE;   
  138.         irpSp->DeviceObject = DeviceObject;   
  139.         irpSp->FileObject = fileObject;   
  140.         irpSp->Parameters.Create.SecurityContext = &securityContext;   
  141.         irpSp->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions;   
  142.         irpSp->Parameters.Create.FileAttributes = (USHORT)FileAttributes;   
  143.         irpSp->Parameters.Create.ShareAccess = (USHORT)ShareAccess;   
  144.         irpSp->Parameters.Create.EaLength = 0;   
  145.   
  146.         IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);   
  147.         status = IoCallDriver(DeviceObject, irp);   
  148.   
  149.         if (status == STATUS_PENDING)   
  150.                 KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);   
  151.   
  152.         status = ioStatus.Status;   
  153.   
  154.         if (!NT_SUCCESS(status))   
  155.         {   
  156.                 ExFreePool(fileObject->FileName.Buffer);   
  157.                 fileObject->FileName.Length = 0;   
  158.                 fileObject->DeviceObject = NULL;   
  159.                 ObDereferenceObject(fileObject);   
  160.         }   
  161.         else  
  162.         {   
  163.                 InterlockedIncrement(&fileObject->DeviceObject->ReferenceCount);   
  164.   
  165.                 if (fileObject->Vpb)   
  166.                 {   
  167.                         InterlockedIncrement(&fileObject->Vpb->ReferenceCount);   
  168.                 }   
  169.                 *Object = fileObject;   
  170.                 DbgPrint(("Open file success! object = %x/n", fileObject));   
  171.         }   
  172.   
  173.         return status;   
  174. }   
  175.   
  176. NTSTATUS   
  177. IrpFileClose(   
  178.         IN PDEVICE_OBJECT DeviceObject,   
  179.         IN PFILE_OBJECT FileObject   
  180.         )   
  181. {   
  182.         NTSTATUS status;   
  183.         KEVENT event;   
  184.         PIRP irp;   
  185.     PVPB vpb;   
  186.         IO_STATUS_BLOCK ioStatusBlock;   
  187.         PIO_STACK_LOCATION irpSp;   
  188.   
  189.     KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  190.         irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);   
  191.   
  192.         if (irp == NULL)   
  193.                 return STATUS_INSUFFICIENT_RESOURCES;   
  194.   
  195.         irp->Tail.Overlay.OriginalFileObject = FileObject;   
  196.     irp->Tail.Overlay.Thread = PsGetCurrentThread();   
  197.     irp->RequestorMode = KernelMode;   
  198.     irp->UserEvent = &event;   
  199.     irp->UserIosb = &irp->IoStatus;   
  200.     irp->Overlay.AsynchronousParameters.UserApcRoutine = (PIO_APC_ROUTINE)NULL;   
  201.     irp->Flags = IRP_SYNCHRONOUS_API | IRP_CLOSE_OPERATION;   
  202.   
  203.     irpSp = IoGetNextIrpStackLocation(irp);   
  204.     irpSp->MajorFunction = IRP_MJ_CLEANUP;   
  205.     irpSp->FileObject = FileObject;   
  206.   
  207.     status = IoCallDriver(DeviceObject, irp);   
  208.   
  209.     if (status == STATUS_PENDING)   
  210.         {   
  211.                 KeWaitForSingleObject(        &event,   
  212.                                                                 UserRequest,   
  213.                                                                 KernelMode,   
  214.                                                                 FALSE,   
  215.                                                                 NULL);   
  216.         }   
  217.   
  218.         IoReuseIrp(irp , STATUS_SUCCESS);   
  219.     KeClearEvent(&event);   
  220.   
  221.     irpSp = IoGetNextIrpStackLocation(irp);   
  222.     irpSp->MajorFunction = IRP_MJ_CLOSE;   
  223.     irpSp->FileObject = FileObject;   
  224.   
  225.     irp->UserIosb = &ioStatusBlock;   
  226.     irp->UserEvent = &event;   
  227.     irp->Tail.Overlay.OriginalFileObject = FileObject;   
  228.     irp->Tail.Overlay.Thread = PsGetCurrentThread();   
  229.     irp->AssociatedIrp.SystemBuffer = (PVOID)NULL;   
  230.     irp->Flags = IRP_CLOSE_OPERATION | IRP_SYNCHRONOUS_API;   
  231.   
  232.     vpb = FileObject->Vpb;   
  233.   
  234.         if (vpb && !(FileObject->Flags & FO_DIRECT_DEVICE_OPEN))   
  235.         {   
  236.                 InterlockedDecrement(&vpb->ReferenceCount);   
  237.                 FileObject->Flags |= FO_FILE_OPEN_CANCELLED;   
  238.         }   
  239.   
  240.     status = IoCallDriver(DeviceObject, irp);   
  241.   
  242.     if (status == STATUS_PENDING)   
  243.         {   
  244.                 KeWaitForSingleObject(        &event,   
  245.                                                                 Executive,   
  246.                                                                 KernelMode,   
  247.                                                                 FALSE,   
  248.                                                                 NULL);   
  249.         }   
  250.   
  251.     IoFreeIrp(irp);   
  252.   
  253.         return status;   
  254. }   
  255.   
  256. NTSTATUS   
  257. IrpFileRead(   
  258.         IN PFILE_OBJECT FileObject,   
  259.         IN PLARGE_INTEGER ByteOffset OPTIONAL,   
  260.         IN ULONG Length,   
  261.         OUT PVOID Buffer,   
  262.         OUT PIO_STATUS_BLOCK IoStatusBlock   
  263.         )   
  264. {   
  265.         NTSTATUS status;   
  266.         KEVENT event;   
  267.         PIRP irp;   
  268.         PIO_STACK_LOCATION irpSp;   
  269.         PDEVICE_OBJECT deviceObject;   
  270.   
  271.         if (ByteOffset == NULL)   
  272.         {   
  273.                 if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))   
  274.                         return STATUS_INVALID_PARAMETER;   
  275.   
  276.                 ByteOffset = &FileObject->CurrentByteOffset;   
  277.         }   
  278.   
  279.         if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL)   
  280.                 return STATUS_UNSUCCESSFUL;   
  281.   
  282.         deviceObject = FileObject->Vpb->DeviceObject;   
  283.         irp = IoAllocateIrp(deviceObject->StackSize, FALSE);   
  284.   
  285.         if (irp == NULL)   
  286.                 return STATUS_INSUFFICIENT_RESOURCES;   
  287.   
  288.         irp->MdlAddress = IoAllocateMdl(Buffer, Length, FALSE, TRUE, NULL);   
  289.   
  290.         if (irp->MdlAddress == NULL)   
  291.         {   
  292.                 IoFreeIrp(irp);   
  293.                 return STATUS_INSUFFICIENT_RESOURCES;;   
  294.         }   
  295.   
  296.         MmBuildMdlForNonPagedPool(irp->MdlAddress);   
  297.   
  298.         irp->Flags = IRP_READ_OPERATION;   
  299.         irp->RequestorMode = KernelMode;   
  300.         irp->UserIosb = IoStatusBlock;   
  301.         irp->UserEvent = &event;   
  302.         irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();   
  303.         irp->Tail.Overlay.OriginalFileObject = FileObject;   
  304.   
  305.         irpSp = IoGetNextIrpStackLocation(irp);   
  306.         irpSp->MajorFunction = IRP_MJ_READ;   
  307.         irpSp->MinorFunction = IRP_MN_NORMAL;   
  308.         irpSp->DeviceObject = deviceObject;   
  309.         irpSp->FileObject = FileObject;   
  310.         irpSp->Parameters.Read.Length = Length;   
  311.         irpSp->Parameters.Read.ByteOffset = *ByteOffset;   
  312.   
  313.         KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  314.         IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);   
  315.         status = IoCallDriver(deviceObject, irp);   
  316.   
  317.         if (status == STATUS_PENDING)   
  318.                 status = KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);   
  319.   
  320.         return status;   
  321. }   
  322.   
  323. NTSTATUS   
  324. IrpFileWrite(   
  325.         IN PFILE_OBJECT FileObject,   
  326.         IN PLARGE_INTEGER ByteOffset OPTIONAL,   
  327.         IN ULONG Length,   
  328.         IN PVOID Buffer,   
  329.         OUT PIO_STATUS_BLOCK IoStatusBlock   
  330.         )   
  331. {   
  332.         NTSTATUS status;   
  333.         KEVENT event;   
  334.         PIRP irp;   
  335.         PIO_STACK_LOCATION irpSp;   
  336.         PDEVICE_OBJECT deviceObject;   
  337.   
  338.         if (ByteOffset == NULL)   
  339.         {   
  340.                 if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))   
  341.                         return STATUS_INVALID_PARAMETER;   
  342.   
  343.                 ByteOffset = &FileObject->CurrentByteOffset;   
  344.         }   
  345.   
  346.         if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL)   
  347.                 return STATUS_UNSUCCESSFUL;   
  348.   
  349.         deviceObject = FileObject->Vpb->DeviceObject;   
  350.         irp = IoAllocateIrp(deviceObject->StackSize, FALSE);   
  351.   
  352.         if (irp == NULL)   
  353.                 return STATUS_INSUFFICIENT_RESOURCES;   
  354.   
  355.         irp->MdlAddress = IoAllocateMdl(Buffer, Length, FALSE, TRUE, NULL);   
  356.   
  357.         if (irp->MdlAddress == NULL)   
  358.         {   
  359.                 IoFreeIrp(irp);   
  360.                 return STATUS_INSUFFICIENT_RESOURCES;;   
  361.         }   
  362.   
  363.         MmBuildMdlForNonPagedPool(irp->MdlAddress);   
  364.   
  365.         irp->Flags = IRP_WRITE_OPERATION;   
  366.         irp->RequestorMode = KernelMode;   
  367.         irp->UserIosb = IoStatusBlock;   
  368.         irp->UserEvent = &event;   
  369.         irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();   
  370.         irp->Tail.Overlay.OriginalFileObject = FileObject;   
  371.   
  372.         irpSp = IoGetNextIrpStackLocation(irp);   
  373.         irpSp->MajorFunction = IRP_MJ_WRITE;   
  374.         irpSp->MinorFunction = IRP_MN_NORMAL;   
  375.         irpSp->DeviceObject = deviceObject;   
  376.         irpSp->FileObject = FileObject;   
  377.         irpSp->Parameters.Write.Length = Length;   
  378.         irpSp->Parameters.Write.ByteOffset = *ByteOffset;   
  379.   
  380.         KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  381.         IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);   
  382.         status = IoCallDriver(deviceObject, irp);   
  383.   
  384.         if (status == STATUS_PENDING)   
  385.                 status = KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);   
  386.   
  387.         return status;   
  388. }   
  389.   
  390. NTSTATUS   
  391. IrpFileQuery(   
  392.         IN PFILE_OBJECT FileObject,   
  393.         OUT PVOID FileInformation,   
  394.         IN ULONG Length,   
  395.         IN FILE_INFORMATION_CLASS FileInformationClass   
  396.         )   
  397. {   
  398.         NTSTATUS status;   
  399.         KEVENT event;   
  400.         PIRP irp;   
  401.         IO_STATUS_BLOCK ioStatus;   
  402.         PIO_STACK_LOCATION irpSp;   
  403.         PDEVICE_OBJECT deviceObject;   
  404.   
  405.         if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL)   
  406.                 return STATUS_UNSUCCESSFUL;   
  407.   
  408.         deviceObject = FileObject->Vpb->DeviceObject;   
  409.         KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  410.         irp = IoAllocateIrp(deviceObject->StackSize, FALSE);   
  411.   
  412.         if (irp == NULL)   
  413.                 return STATUS_INSUFFICIENT_RESOURCES;   
  414.   
  415.         irp->Flags = IRP_BUFFERED_IO;   
  416.         irp->AssociatedIrp.SystemBuffer = FileInformation;   
  417.         irp->RequestorMode = KernelMode;   
  418.         irp->Overlay.AsynchronousParameters.UserApcRoutine = (PIO_APC_ROUTINE)NULL;   
  419.         irp->UserEvent = &event;   
  420.         irp->UserIosb = &ioStatus;   
  421.         irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();   
  422.         irp->Tail.Overlay.OriginalFileObject = FileObject;   
  423.   
  424.         irpSp = IoGetNextIrpStackLocation(irp);   
  425.         irpSp->MajorFunction = IRP_MJ_QUERY_INFORMATION;   
  426.         irpSp->DeviceObject = deviceObject;   
  427.         irpSp->FileObject = FileObject;   
  428.         irpSp->Parameters.QueryFile.Length = Length;   
  429.         irpSp->Parameters.QueryFile.FileInformationClass = FileInformationClass;   
  430.   
  431.         IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);   
  432.         status = IoCallDriver(deviceObject, irp);   
  433.   
  434.         if (status == STATUS_PENDING)   
  435.                 KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);   
  436.   
  437.         return ioStatus.Status;   
  438. }   
  439.   
  440. NTSTATUS   
  441. IrpDirectoryQuery(   
  442.         IN PFILE_OBJECT FileObject,   
  443.         IN FILE_INFORMATION_CLASS FileInformationClass,   
  444.         OUT PVOID Buffer,   
  445.         IN ULONG Length   
  446.         )   
  447. {   
  448.         NTSTATUS status;   
  449.         KEVENT event;   
  450.         PIRP irp;   
  451.         IO_STATUS_BLOCK ioStatus;   
  452.         PIO_STACK_LOCATION irpSp;   
  453.         PDEVICE_OBJECT deviceObject;   
  454.         PQUERY_DIRECTORY queryDirectory;   
  455.   
  456.         if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL)   
  457.                 return STATUS_UNSUCCESSFUL;   
  458.   
  459.         deviceObject = FileObject->Vpb->DeviceObject;   
  460.         KeInitializeEvent(&event, SynchronizationEvent, FALSE);   
  461.         irp = IoAllocateIrp(deviceObject->StackSize, FALSE);   
  462.   
  463.         if (irp == NULL)   
  464.                 return STATUS_INSUFFICIENT_RESOURCES;   
  465.   
  466.         irp->Flags = IRP_INPUT_OPERATION | IRP_BUFFERED_IO;   
  467.         irp->RequestorMode = KernelMode;   
  468.         irp->UserEvent = &event;   
  469.         irp->UserIosb = &ioStatus;   
  470.         irp->UserBuffer = Buffer;   
  471.         irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();   
  472.         irp->Tail.Overlay.OriginalFileObject = FileObject;   
  473.         irp->Overlay.AsynchronousParameters.UserApcRoutine = (PIO_APC_ROUTINE)NULL;   
  474.         //irp->Pointer = FileObject;   
  475.   
  476.         irpSp = IoGetNextIrpStackLocation(irp);   
  477.         irpSp->MajorFunction = IRP_MJ_DIRECTORY_CONTROL;   
  478.         irpSp->MinorFunction = IRP_MN_QUERY_DIRECTORY;   
  479.         irpSp->DeviceObject = deviceObject;   
  480.         irpSp->FileObject = FileObject;   
  481.   
  482.         queryDirectory = (PQUERY_DIRECTORY)&irpSp->Parameters;   
  483.         queryDirectory->Length = Length;   
  484.         queryDirectory->FileName = NULL;   
  485.         queryDirectory->FileInformationClass = FileInformationClass;   
  486.         queryDirectory->FileIndex = 0;   
  487.   
  488.         IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);   
  489.         status = IoCallDriver(deviceObject, irp);   
  490.   
  491.         if (status == STATUS_PENDING)   
  492.         {   
  493.                 KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);   
  494.                 status = ioStatus.Status;   
  495.         }   
  496.   
  497.         return status;   
  498. }   
  499.   
  500. BOOLEAN GetDriveObject(   
  501.         IN ULONG DriveNumber,   
  502.         OUT PDEVICE_OBJECT *DeviceObject,   
  503.         OUT PDEVICE_OBJECT *ReadDevice   
  504.         )   
  505. {   
  506.         WCHAR driveName[] = L"//DosDevices//A://";   
  507.         UNICODE_STRING deviceName;   
  508.         HANDLE deviceHandle;   
  509.         OBJECT_ATTRIBUTES objectAttributes;   
  510.         IO_STATUS_BLOCK        ioStatus;   
  511.         PFILE_OBJECT fileObject;   
  512.         NTSTATUS status;   
  513.   
  514.         if (DriveNumber >= 'A' && DriveNumber <= 'Z')   
  515.         {   
  516.                 driveName[12] = (CHAR)DriveNumber;   
  517.         }   
  518.         else if (DriveNumber >= 'a' && DriveNumber <= 'z')   
  519.         {   
  520.                 driveName[12] = (CHAR)DriveNumber - 'a' + 'A';   
  521.         }   
  522.         else  
  523.         {   
  524.                 return FALSE;   
  525.         }   
  526.   
  527.         RtlInitUnicodeString(&deviceName, driveName);   
  528.   
  529.         InitializeObjectAttributes(        &objectAttributes,   
  530.                                                                 &deviceName,   
  531.                                                                 OBJ_CASE_INSENSITIVE,   
  532.                                                                 NULL,   
  533.                                                                 NULL);   
  534.   
  535.         status = IoCreateFile(        &deviceHandle,   
  536.                                                         SYNCHRONIZE | FILE_ANY_ACCESS,   
  537.                                                         &objectAttributes,   
  538.                                                         &ioStatus,   
  539.                                                         NULL,   
  540.                                                         0,   
  541.                                                         FILE_SHARE_READ | FILE_SHARE_WRITE,   
  542.                                                         FILE_OPEN,   
  543.                                                         FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,   
  544.                                                         NULL,   
  545.                                                         0,   
  546.                                                         CreateFileTypeNone,   
  547.                                                         NULL,   
  548.                                                         0x100);   
  549.   
  550.         if (!NT_SUCCESS(status))   
  551.         {   
  552.                 DbgPrint(("Could not open drive %c: %x/n", DriveNumber, status));   
  553.                 return FALSE;   
  554.         }   
  555.   
  556.         status = ObReferenceObjectByHandle(        deviceHandle,   
  557.                                                                                 FILE_READ_DATA,   
  558.                                                                                 *IoFileObjectType,   
  559.                                                                                 KernelMode,   
  560.                                                                                 &fileObject,   
  561.                                                                                 NULL);   
  562.   
  563.         if (!NT_SUCCESS(status))   
  564.         {   
  565.                 DbgPrint(("Could not get fileobject from handle: %c/n", DriveNumber));   
  566.                 ZwClose(deviceHandle);   
  567.                 return FALSE;   
  568.         }   
  569.   
  570.         if (fileObject->Vpb == 0 || fileObject->Vpb->RealDevice == NULL)   
  571.         {   
  572.                 ObDereferenceObject(fileObject);   
  573.                 ZwClose(deviceHandle);   
  574.                 return FALSE;   
  575.         }   
  576.   
  577.         *DeviceObject = fileObject->Vpb->DeviceObject;   
  578.         *ReadDevice = fileObject->Vpb->RealDevice;   
  579.   
  580.         ObDereferenceObject(fileObject);   
  581.         ZwClose(deviceHandle);   
  582.   
  583.         return TRUE;   
  584. }  
GameFramework 框架详解之 Network网络模块 工具链 GameFramework(下面简称GF)Demo中,已经给我们提供了Network模块使用的protobuf使用的动态链接库protobuf-net.dll,但是GF并没有给我们提供protobuf相关的工具链,比如:1.proto文件自动导出对应c#的Packet类和PacketHandler类2.导出Packet类继承IReference以便使用引用池。3.自动生成Packet类和PacketHandler的Id,且保持和服务器Id一一对应。 阅读详情

相关推荐

银河麒麟系统安装redis【亲测可行】

架构:Linux 5.10.0-9-generic x86_64 GNU/Linux。redis版本:redis-6.2.3.tar.gz。然后在执行make install,结束;OS:银河麒麟V10(SP1)未激活。cpu:I5-10代;

lx_nhs的博客 3332

IRP操作文件填坑日记

背景: 近段时间一个项目需要IRP操作文件.于是.搜索硬盘.把好几年前的代码找出来.说起这个代码,需要感谢黑月教主(achillis)和炉子.当时炉子开源了PsVoid. 里面就有Irp操作文件.但是抄了之后.win7蓝屏.当时水平太菜.只好在Q上麻烦教主帮忙.教主帮忙分析一番之后.于是网上就有了.那个经典的ULONG UnKnow[41]. 然后各个博客转载…当然了.当时我自己也先存了一份.不过...

zz_strive_2012的专栏 595

音视频入门:H264、H265概念总结

添加链接描述 什么是H.264与H.265 H.264与H.265都是视频压缩格式,由于视频本身的码流太大,所以需要经过压缩然后再通过网络进行传输。H.264是目前比较主流的压缩算法,像视频会议设备一般都采用这个编码格式。基础的H.264可以支持在1M带宽下传输720P30帧/秒的图像;H.264 HIGH PROFILE支持在512K带宽下传输720P30帧/秒的图像。 H.265是比较新的压缩算法,可以更一步提高压缩比,随着我们现在生活中出现的视频格式越来越大(比如现在基本都是1080P甚至4K的显示器

weixin_40673765的博客 8936

使用IRP进行文件操作

一定要先感谢为技术的进步而付出辛勤汗水的人,感谢他们对技术的共享.一个通用IRP访问文件的十六进制编辑器(开源代码)     --   被诅咒的神(邪恶八进制信息安全团队)Windows平台内核级文件访问                               --   baiyuanfan (baiyuanfan@163.com)特别感谢被诅咒的神,他写的里面包含了非常多

2788

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架

本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。

weixin_42659194的博客 338

COMSOL实战:如何用有限元法(FEM)准确仿真电磁场问题?避坑指南

本文是一份COMSOL电磁场仿真实战指南,重点讲解如何运用有限元法(FEM)准确模拟电磁场问题。文章通过矩形波导和偶极子天线两大经典案例,详细剖析了从几何建模、物理场设置、网格剖分到结果验证的全流程,并提供了处理非线性材料、求解器收敛失败等高级问题的避坑技巧,旨在帮助工程师建立可靠的仿真工作流。

weixin_29297127的博客 512

IRP管理文件

NTSTATUS IrpCreateFile( OUT PFILE_OBJECT *ppFileObject, IN ACCESS_MASK DesiredAccess, IN PUNICODE_STRING pustrFilePath, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN

weixin_42539095的博客 278

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

irp追踪工具_CreateFile_进行通讯 打印主请求号

/************************************************************************ * 文件名称:Driver.h * 作 者:张帆 * 完成日期:2007-11-1 *******************************...

483

QML 果冻抖动:用 Scale 动画模拟 Q 弹反馈

介绍果冻抖动效果:点击后卡片通过多段 ParallelAnimation 实现 Scale X/Y 反向缩放和逐步衰减,模拟果冻弹性形变;进阶版本加入小幅 Rotation 增加活泼感,适合游戏、儿童应用等趣味反馈场景。

u011186532的专栏 424

【即插即用模块】卷积篇 | CVPR 2025 | LSConv:大核捕全局,小核提速度,替换 3×3 卷积/自注意力,精度效率双飙升

文章摘要: LSConv是一种新型卷积模块,采用"大核感知+小核聚合"策略,在轻量级视觉任务中表现出色。该模块由两部分组成:7×7深度可分离卷积(LKP)捕捉全局信息,动态3×3卷积(SKA)实现高效特征聚合。相比传统卷积和自注意力机制,LSConv在降低计算量的同时提升了精度,尤其适合高分辨率视觉任务。实验表明,在轻量化模型中用LSConv替代3×3卷积或自注意力,可显著减少计算量并提高准确率。模块支持即插即用,提供Triton优化实现,可直接集成到现有卷积或Transformer架构

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1119

内核文件管理-IRP(一)创建或打开文件

内核下通过直接向 FSD (File System Driver) 发送 IRP (I/O Request Packet)来管理文件,可以绕过一些 API Hook。 本文讲怎样通过向 FSD 发送 IRP_MJ_CREATE 消息的 IRP 来创建或打开文件(或目录)。 头文件及其他声明或定义 #include <ntifs.h> typedef struct _AUX_ACCESS_DATA { PPRIVILEGE_SET PrivilegesUsed; GENERIC_MAPPIN

m0_48995611的博客 1261

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决

原文发表于百度空间,2010-04-05========================================================================== 这也许是我这个假期唯一做的跟Code有关的事了,已经一个多月没写代码了~~问题是这样的,某同学A,在自己的工程中使用了PsVoid的部分驱动源码(感谢炉子开源~~),提到里面的IrpCreateFile函数在...

weixin_30872157的博客 275

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

内核无HOOK文件防删除

内核无HOOK文件防删除,可以过冰刃,xuetr,easydelete  本来是打算写暴力删除文件的程序的,结果意外发现,只需要在内核发送irp打开一个文件,之后不关闭Object,就拒绝其他程序访问了,easydelete这个工具还是比较强的,不过也不能删除,关键是不挂钩任何函数,不修该系统内核,看属性的时候只能看到一个常规,其它的什么都看不到,当然了360(7.0

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1156

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【半原创】Irp占坑保护文件不被删除

Irp操作出自125096的博客 http://blog.youkuaiyun.com/qq125096885/article/details/53033896 这里提下 博主的例子中使用irpclose文件对象,这可能会造成蓝屏。 见链接:https://bbs.pediy.com/thread-215269.htm 所以这里把IrpCloseFile改为ObDereferenceObj

zhuhuibeishadiao 2419

MFC中的CFile以及windowsAPI

在VC编程中,操作文件的方法主要有两种:利用API函数和MFC的CFile类。微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。  1.创建或打开一个文件   API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。 HA

花落孤独 1782

Win32学习笔记——windows的库

一 静态库 1. 静态库的特点 1.1 目标程序的归档。 1.2 静态库的代码会被嵌入到程序当中。 1.3 程序执行时不需要静态库存在。 2. C语言静态库 2.1 创建静态库 创建Win32静态库项目,使用*.c文件文件建立项目。 2.2 添加静态库函数 2.3 在程序中将静态库导入 2.3.1 项目中使用Setting里设置 2.3.2 使用关键字 p

biluolunhui的专栏 868

types.h头文件学习

types.h头文件纵观,就可以看出是对一些数据类型的重命名或者是定义,以及对DMA通用地址的定义以及其64为的特性。下面是types.h头文件的源代码,主要的学习内容都在注释当中。 #ifndef _I386_TYPES_H #define _I386_TYPES_H #ifndef __ASSEMBLY__ /** * 纵观这个头文件,发现该头文件主要是用来给 * 定义类型以及...

hongbochen1223的专栏 947

自己构造 Create IRP

NTSTATUS IrpCreate(IN PUNICODE_STRING Name,IN ACCESS_MASK DesiredAccess,IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PDEVICE_OBJECT DeviceObject,IN

1302

IRP_MJ_CREATE

IRP_MJ_CREATE 发送时机: IO管理器在一个文件或目录创建时, 或一个已存在的文件,设备,目录,Volume被打开时 发送此IRP. 通常在应用层调用CreateFile, 或内核层调用: IoCreateFile IoCreateFileSpecifyDeviceObjectHint ZwCreateFile ZwOpenFile 引发此I...

weixin_33805992的博客 551

IRP操作文件之再填坑

啧,大佬飘过……文字较多,可以直接看最后面的 最近在捣腾发送IRP_MJ_CREATE打开文件,同时要能解 reparse point。几顿操作猛如虎之后,终于可以正常解析 reparse point了,然后就像检验一下,这整个流程和IoCreateFile的区别大不大。就在打开的时候,加了个 FILE_DELETE_ON_CLOSE标记,看看FileObject销毁后文件是否...

zz_strive_2012的专栏 641

【驱动笔记9】初探IRP

  文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34005738.html       此前我们可能曾经多次听说过IRP这个名词,那么它究竟是什么呢?      IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结...

weixin_34124939的博客 202

悲剧膜拜一句话刷新缓存

悲剧膜拜一句话刷新缓存 前两天苦恼于如何刷新缓存,本来打算按照正常思路直接找CcFlushxx和MmFlushXX的参数,也就是遍历CcVACBs,尚未尝试不知是否可行之际无意发现Azy大牛博客上最后一篇文章写得一句话刷新缓存。膜拜之,我思路还是太窄了~ HANDLE hFile = CreateFile(L"\\\\.\\C:", GENERIC_WRITE|GENERIC_READ

Returns' Station 2128

IRP操作文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 [cpp] view plain copy #include       #ifndef MAX_PATH   #define MAX_PATH          260   #endif      NTSTATUS ObOpenObjectByPointer(PVOID Obje

zz_strive_2012的专栏 1591
上一篇: XP中Inline HOOK 8042驱动实现键盘钩子的方法
下一篇: PVASE Process Virtual Address Space Erasing
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值