<mark id="7fvjt"></mark><sub id="7fvjt"><progress id="7fvjt"></progress></sub>

        <th id="7fvjt"><form id="7fvjt"></form></th><sub id="7fvjt"></sub>

        <track id="7fvjt"><progress id="7fvjt"></progress></track>

          <menuitem id="7fvjt"><track id="7fvjt"><meter id="7fvjt"></meter></track></menuitem><sub id="7fvjt"></sub>

              <address id="7fvjt"></address>
              International       English      China       
              加密軟件網DRM Plus視頻加密方案
              首頁 SmartPhone DRM加密方案列表 DRM演示中心 軟件定制服務 加密狗 國際軟件 聯系我們
               
              文件過濾加密的源代碼   返回

              //過濾讀

              NTSTATUS SfRead(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

              {

              PIO_STACK_LOCATION irp_stack;

              BOOLEAN is_crypt;

              NTSTATUS status;

              PSFILTER_DEVICE_EXTENSION devExt;

              PAGED_CODE();

              ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ));

              ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

              devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

              if(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))

              {

              irp_stack = IoGetCurrentIrpStackLocation( Irp );

              is_crypt = IsMyCryptFile(irp_stack->FileObject);

              if(is_crypt) //是我的加密文件

              {

              //設置完成例程

              IoCopyCurrentIrpStackLocationToNext( Irp );

              IoSetCompletionRoutine(Irp, SfReadCompletion, 0, TRUE, FALSE, FALSE);

              //調用原來的驅動

              return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

              }

              }

              //非加密文件

              IoSkipCurrentIrpStackLocation(Irp);

              return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

              }

              //讀操作的完成例程

              NTSTATUS SfReadCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

              {

              ULONG length; //長度

              PUCHAR buffer; //緩沖區

              ULONG i;

              PIO_STACK_LOCATION irp_stack;

              irp_stack = IoGetCurrentIrpStackLocation( Irp );

              ShowUnicodeString(&(irp_stack->FileObject->FileName));

              DbgPrint("SfReadCompletion 讀文件解密");

              length = Irp->IoStatus.Information;

              buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

              for(i = 0; i < length; i++)

              {

              buffer[i] = buffer[i] - 17; //解密

              }

              return STATUS_SUCCESS;

              }

              //過濾寫

              NTSTATUS SfWrite(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

              {

              PIO_STACK_LOCATION irp_stack;

              BOOLEAN is_crypt;

              NTSTATUS status;

              PSFILTER_DEVICE_EXTENSION devExt;

              PAGED_CODE();

              ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ));

              ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

              devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

              if(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))

              {

              irp_stack = IoGetCurrentIrpStackLocation( Irp );

              is_crypt = IsMyCryptFile(irp_stack->FileObject);

              if(is_crypt)

              {

              ULONG length; //長度

              PUCHAR buffer, buffer2; //原來緩沖區和加密后緩沖區

              ULONG i;

              PMDL new_mdl;

              length = irp_stack->Parameters.Write.Length;

              buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

              //分配同樣大小的空間

              buffer2 = (PUCHAR)ExAllocatePool(NonPagedPool, length);

              if(buffer2 != 0)

              {

              ShowUnicodeString(&(irp_stack->FileObject->FileName));

              DbgPrint("SfWrite 寫文件加密");

              for(i = 0; i < length; i++)

              {

              buffer2[i] = buffer[i] + 17; //加密

              }

              //設置完成例程

              IoCopyCurrentIrpStackLocationToNext( Irp );

              IoSetCompletionRoutine(Irp, SfWriteCompletion, Irp->MdlAddress, TRUE, TRUE, TRUE);

              //替換成新的緩沖區

              new_mdl = IoAllocateMdl(buffer2, length, FALSE, TRUE, NULL);

              MmBuildMdlForNonPagedPool(new_mdl);

              Irp->MdlAddress = new_mdl;

              //調用原來的驅動

              return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

              }

              else

              {

              ShowUnicodeString(&(irp_stack->FileObject->FileName));

              DbgPrint("SfWrite 寫不能分配內存");

              Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;

              Irp->IoStatus.Information = 0;

              IoCompleteRequest( Irp, IO_NO_INCREMENT );

              return Irp->IoStatus.Status;

              }

              }

              }

              //非加密文件

              IoSkipCurrentIrpStackLocation(Irp);

              return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

              }

              //寫完成后就把分配的空間給刪除掉

              NTSTATUS SfWriteCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

              {

              PMDL old_mdl, new_mdl;

              PUCHAR buffer2; //我分配的緩沖區

              PIO_STACK_LOCATION irp_stack;

              irp_stack = IoGetCurrentIrpStackLocation( Irp );

              ShowUnicodeString(&(irp_stack->FileObject->FileName));

              DbgPrint("完成: SfWriteCompletion");

              new_mdl = Irp->MdlAddress;

              old_mdl = (PMDL)Context;

              //還是指向原來的緩沖區

              Irp->MdlAddress = old_mdl;

              //刪除掉我分配的緩沖區

              buffer2 = MmGetSystemAddressForMdlSafe(new_mdl, NormalPagePriority);

              IoFreeMdl(new_mdl);

              ExFreePool(buffer2);

              return STATUS_SUCCESS;

              }

              //文件打開的時候調用

              NTSTATUS SfCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

              {

              NTSTATUS status;

              PSFILTER_DEVICE_EXTENSION devExt;

              PAGED_CODE();

              //如果不是過濾驅動設備就退出

              if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))

              {

              Irp->IoStatus.Status = STATUS_SUCCESS;

              Irp->IoStatus.Information = 0;

              IoCompleteRequest( Irp, IO_NO_INCREMENT );

              return STATUS_SUCCESS;

              }

              ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

              devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

              //設置完成例程

              IoCopyCurrentIrpStackLocationToNext( Irp );

              IoSetCompletionRoutine(Irp, SfCreateCompletion, 0, TRUE, FALSE, FALSE);

              //調用原來的驅動

              return IoCallDriver( devExt->AttachedToDeviceObject, Irp );

              }

              //在打開文件的完成例程中記錄文件對象

              NTSTATUS SfCreateCompletion(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID Context)

              {

              PIO_STACK_LOCATION irp_stack;

              PFILE_OBJECT file_obj;

              BOOLEAN is_crypt;

              irp_stack = IoGetCurrentIrpStackLocation(Irp);

              file_obj = irp_stack->FileObject;

              is_crypt = IsMyCryptFile(file_obj);

              if(is_crypt)

              {

              if(CcIsFileCached(file_obj))

              {

              ShowUnicodeString(&(file_obj->FileName));

              DbgPrint("打開時清除緩存 \n");

              CcPurgeCacheSection(file_obj->SectionObjectPointer, 0, 0, FALSE);

              }

              }

              return STATUS_SUCCESS;

              }

              //關閉文件后的清理工作

              NTSTATUS SfCleanupClose(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)

              {

              NTSTATUS status;

              PSFILTER_DEVICE_EXTENSION devExt;

              PIO_STACK_LOCATION irp_stack;

              PFILE_OBJECT file_obj;

              BOOLEAN is_crypt;

              PAGED_CODE();

              if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))

              {

              Irp->IoStatus.Status = STATUS_SUCCESS;

              Irp->IoStatus.Information = 0;

              IoCompleteRequest( Irp, IO_NO_INCREMENT );

              return STATUS_SUCCESS;

              }

              ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

              irp_stack = IoGetCurrentIrpStackLocation(Irp);

              file_obj = irp_stack->FileObject;

              is_crypt = IsMyCryptFile(file_obj);

              if(is_crypt)

              {

              if(CcIsFileCached(file_obj))

              {

              ShowUnicodeString(&(file_obj->FileName));

              DbgPrint("關閉時清除緩存 \n");

              CcPurgeCacheSection(file_obj->SectionObjectPointer, 0, 0, FALSE);

              }

              }

              IoSkipCurrentIrpStackLocation( Irp );

              devExt = (PSFILTER_DEVICE_EXTENSION)(DeviceObject->DeviceExtension);

              return IoCallDriver(devExt->AttachedToDeviceObject, Irp);

              }





              China-DRM.com All Rights Reserved.
              秒速时时彩连续开

              <mark id="7fvjt"></mark><sub id="7fvjt"><progress id="7fvjt"></progress></sub>

                    <th id="7fvjt"><form id="7fvjt"></form></th><sub id="7fvjt"></sub>

                    <track id="7fvjt"><progress id="7fvjt"></progress></track>

                      <menuitem id="7fvjt"><track id="7fvjt"><meter id="7fvjt"></meter></track></menuitem><sub id="7fvjt"></sub>

                          <address id="7fvjt"></address>

                          <mark id="7fvjt"></mark><sub id="7fvjt"><progress id="7fvjt"></progress></sub>

                                <th id="7fvjt"><form id="7fvjt"></form></th><sub id="7fvjt"></sub>

                                <track id="7fvjt"><progress id="7fvjt"></progress></track>

                                  <menuitem id="7fvjt"><track id="7fvjt"><meter id="7fvjt"></meter></track></menuitem><sub id="7fvjt"></sub>

                                      <address id="7fvjt"></address>