2012年4月30日

文件删除

摘要: 操作系统内部文件删除的步骤: 删除的操作,第一步是打开文件,打开文件的时候必须设置为可以删除。如果打开失败,则直接导致无法删除文件。第二步设置文件属性为用于删除,第三步关闭文件即可。关闭的时候,文件被系统删除。这里的“删除”并非把文件删除到回收站,而是彻底的就爱那个文件清除,文件删除到回收站只是一种改名操作。I、打开文件 IoCreateFile完成例程 NTSTATUS SetInformationCompletion( IN PDEVICE_OBJECT DeviceObject, ... 阅读全文

posted @ 2012-04-30 15:12 xmcc 阅读(751) 评论(0) 推荐(0) 编辑

2012年4月19日

IRP三种操作

摘要: IRP的操作通常状态下派遣函数调用IoCompleteRequest 结束当前IRP请求但在一些情况下可能要挂起irp 用内核函数IoMarkIrpPending 挂起IRP并返回 STATUS_PENDING ,对于ring3级的请求会返回False 这时用GetLastError会发现错误码是ERROR_IO_PENDING 表明当前操作被挂起。为了最终要结束所有的IRP请求,我们需要保存被挂起的IRP,并在最后进行处理(IRP_MJ_CLEANUP)还有一种情况是取消IRP的请求IoSetCancelRoutine(PIRP pIrp, PDRIVER_CANCEL CancelRout 阅读全文

posted @ 2012-04-19 21:10 xmcc 阅读(1314) 评论(0) 推荐(0) 编辑

2012年4月17日

驱动内的多线程

摘要: 内核模式下的多线程使用函数NTSTATUSPsCreateSystemThread( __out PHANDLE ThreadHandle, //所创建的线程句柄 __in ULONG DesiredAccess,//权限 一般为0 __in_opt POBJECT_ATTRIBUTES ObjectAttributes,//线程属性 一般为NULL __in_opt HANDLE ProcessHandle,//指定创建的时用户线程还是系统线程 NULL则为系统线程 NtCurrentProcess()获取当前进程句柄 __out_opt PCLIENT_ID... 阅读全文

posted @ 2012-04-17 21:13 xmcc 阅读(691) 评论(0) 推荐(0) 编辑

2012年4月13日

QQ

摘要: 做了一个很艰难的决定,收心、封存企鹅。 阅读全文

posted @ 2012-04-13 08:35 xmcc 阅读(114) 评论(0) 推荐(0) 编辑

2012年4月12日

IRP 续四 取消IRP(转)

摘要: 上一篇说的是挂起IRP, 并在挂起IRP的时候将挂起的IRP结束, 还有另外一个办法就是取消IRP, 逐个结束. 这就是传说中的取消IRP请求. 这个取消IRP还是比较有用的, 我们很多时候在打开一个文件的时候, 如果需要等待的时间太长, 发现这个文件本来有不是太有用, 一般就会去点取消按钮. 取消当然需要内核的支持.在内核中如果要支持取消IRP, 那么首先要调用IoSetCancelRoutine, 设置一个取消例程, 这个IoSetCancelRoutine函数也是有两个作用, 如果传递的非NULL值, 那么就是设置取消例程, 如果是NULL, 那么就是删除原来设置的(取消例程).如果是在 阅读全文

posted @ 2012-04-12 21:10 xmcc 阅读(590) 评论(0) 推荐(0) 编辑

IRP 续三 挂起当前IRP(转)

摘要: 挂起当前IRP如果需要将IRP异步完成, 一般不会在处理函数中调用IoCompleteRequest函数, 因为调用IoCompleteRequest函数就意味着,该IRP请求处理完成了, 事实上很多时候是需要多次处理, 或者有其他需求的, 这边先谈谈将当前IRP挂起.挂起意味着,是异步操作, 那么需要等待以后某个时机再处理, 当然这个时机问题的话, 以后会了解到, 目前需要解决的是挂起当前IRP的方法.下面这个驱动的功能就是这样, 将所有的IRP都挂起, 在最后Win32这边调用CloseHandle的时候再统一处理, 完成那些IRP请求. 一种异步完成IRP的例子. 除了挂起还要取消什么的 阅读全文

posted @ 2012-04-12 20:58 xmcc 阅读(411) 评论(0) 推荐(0) 编辑

2012年4月10日

IRP 续二

摘要: 在第一篇中ring3的调用程序设置了DeviceIoControl 但是在驱动中未设置IRP_MJ_DEVICE_CONTROL现在补上代码#define IOCODE CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS )//0x0000-0x7FFF:微软保留 0x800-0xFFF 由用户自定义(因为我在ring3用800)#pragma code_seg( "PAGE" )NTSTATUS DeviceControl(PDEVICE_OBJECT pDevice, PIRP irp){ 阅读全文

posted @ 2012-04-10 23:07 xmcc 阅读(264) 评论(0) 推荐(0) 编辑

IRP 续一

摘要: 贴一下上篇文章创建新设备的代码#pragma code_seg("INIT" ) void CreateDevice(PDRIVER_OBJECT driver){ ULONG j; NTSTATUS statuss; UNICODE_STRING StDeviceName = {0}; UNICODE_STRING StSysLinkName= {0}; PDEVICE_EXT pExt=NULL; PDEVICE_OBJECT pDeviceObj = NULL; RtlInitUnicodeString(&StDeviceName, L... 阅读全文

posted @ 2012-04-10 21:52 xmcc 阅读(437) 评论(0) 推荐(0) 编辑

2012年4月9日

IRP

摘要: IRPIrp(I/O Resquet Package)即输入输出请求包,其处理机制类似于Ring3下应用程序的消息处理机制。Ring3 根据接收的消息类别进行处理Irp 驱动程序根据接收不同类型的Irp后,进入不同的派遣函数,在派遣函数中IRP得到相应的处理。IRP的结构比较复杂,现先了解两个基本属性 MajorFuntion MinorFuntion主类型和子类型,在一个驱动中DriverObject->MajorFunction 是一个数组,主要记录派遣函数的地址,操作系统会根据接收的IRP进入不同的派遣函数中,在派遣函数中还会判断这个IRP属于那种MinorFuntion。下面代码 阅读全文

posted @ 2012-04-09 22:19 xmcc 阅读(1566) 评论(0) 推荐(0) 编辑

导航