驱动开发
红色代码
Debug The World
展开
-
驱动学习笔记2-用程序加载NT驱动程序
NT驱动程序的加载:1:为NT驱动创建新的服务.2:开启此项服务3:关闭此项服务4:删除NT驱动创建的服务(1)打开SCM管理器SC_HANDLE WINAPI OpenSCManager( __in LPCTSTR lpMachineName,//计算机名称.NULL或者空表示本机 __in LPCTSTR lpDatabaseName,//SCM数据库名原创 2009-08-11 22:48:00 · 1941 阅读 · 0 评论 -
ReactOS编译成VS工程
首先从https://www.reactos.org/wiki/ReactOS_Build_Environment下载Reactos BE 工具,安装,桌面会自动生成一个原创 2014-04-25 16:34:03 · 4028 阅读 · 1 评论 -
win7 下调试未签名的驱动
开机时按F8用“禁用驱动程序签名强制”模式进入系统,就可以正常加载驱动原创 2013-10-09 17:31:36 · 1552 阅读 · 0 评论 -
VS2010中没有Virtualddk菜单的解决办法
依次从VS2010中打开如下 工具-自定义,切换到命令选项卡.从菜单栏的下拉列表中选择 "调试"菜单然后点击下面的"添加命令"按钮,在弹出的对话框中选择"外接程序",里面会看到Virtualddk的各种菜单.加入即可...原创 2013-08-19 16:34:32 · 1801 阅读 · 0 评论 -
直接方式读写
NTSTATUS DRIVER_DispatchRead(PDEVICE_OBJECT pDeviceObject,PIRP pIrp){ NTSTATUS ntStatus=STATUS_UNSUCCESSFUL; __try { PIO_STACK_LOCATION pStack=IoGetCurrentIrpStackLocation(pIrp); PDEVICE_EXTEN原创 2012-03-03 18:54:00 · 981 阅读 · 0 评论 -
缓冲区方式读
// 驱动层代码#ifdef __cplusplusextern "C" {#endifNTSTATUS DriverEntry( IN OUT PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ){ PDEVICE_OBJECT pdoDeviceObj = 0;原创 2012-03-01 00:22:53 · 663 阅读 · 0 评论 -
内核模式下的注册表操作
VOID RegTest(){ WCHAR* pKey=L"\\Registry\\Machine\\SOFTWARE\\Yjz"; // 查找项 if (!NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE,pKey))) { KdPrint(("注册表项不存在\r\n")); // 创建项 if (NT_SUCCESS原创 2012-02-28 23:21:37 · 4243 阅读 · 1 评论 -
内核模式下的字符串操作
VOID StringTest(){ // ASCII 字符串 CHAR* char1="Hello,World"; KdPrint(("char1=%s\r\n",char1)); // 宽字符字符串 WCHAR* wchar1=L"Hello,World"; KdPrint(("wchar1=%ws\r\n",wchar1)); KdPrint(("wchar1=%S\r\n原创 2012-02-25 00:27:28 · 2656 阅读 · 0 评论 -
内核模式下的文件操作
VOID FileTest(){ // 创建文件 UNICODE_STRING FileName; RtlInitUnicodeString(&FileName,L"\\??\\c:\\DriverFile.txt"); HANDLE hFile=NULL; OBJECT_ATTRIBUTES objAttribute; IO_STATUS_BLOCK io_Status_block原创 2012-02-27 00:20:47 · 2974 阅读 · 1 评论 -
链表操作
struct MYLIST { int iNum; LIST_ENTRY ListEntry;};VOID ListTest(){ LIST_ENTRY mListHeader; InitializeListHead(&mListHeader); // 初始化头结点 for (int i=0;i<10;i++) { MYLIST* mList=(MY原创 2012-02-22 17:07:53 · 924 阅读 · 0 评论 -
RTL内存函数
VOID RTL_Test(){ const int BUFSIZE=1024; UCHAR* pBuf1=(UCHAR*)ExAllocatePool(PagedPool,BUFSIZE); // 分配内存 KdPrint(("分配的内存地址pBuf1=%08X",pBuf1)); UCHAR* pBuf2=(UCHAR*)ExAllocatePool(PagedPool,B原创 2012-02-22 21:20:37 · 2775 阅读 · 0 评论 -
LookaSide分配内存
VOID TestLookaSide(){ PAGED_LOOKASIDE_LIST nPageLookasidelist; ExInitializePagedLookasideList(&nPageLookasidelist,NULL,NULL,0,sizeof(MYLIST),'1234',0); // 初始化LOOKASIDE对象 const int TESTLEN=1000; f原创 2012-02-22 20:57:36 · 935 阅读 · 0 评论 -
驱动入门1
1:驱动对象:每个驱动都有一个驱动对象与之对应,且这个驱动对象是在驱动加载时,被内核中的对象管理器创建的.其中pDriverObject是作为驱动的一个实例被内核(确切的说是IO管理器)加载.定义如下:typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; //每个驱动程序都有一个或者多个设备对象.每个设备对象都有一个指针指原创 2009-08-11 01:40:00 · 1121 阅读 · 0 评论 -
DPC
DeferredProcecure Call,延迟过程调用。是一种执行在任意线程上下文的DISPATCH_LEVEL层的可执行例程。硬件中断使用他们处理来自设备的中断。硬件驱动这样做是因为ISR通常运行在更高IRQLs(高于DISPATCH_LEVEL),如果他们花费太长时间,可能会降低系统的整体性能。因此,ISR典型的队列一个DPC并且马上返回,所以系统可以处理其它的中断请求。软驱动能使用DPC翻译 2017-06-15 01:06:41 · 1088 阅读 · 0 评论