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.
                        秒速赛车3-8码技巧