驱动编程
125096
这个作者很懒,什么都没留下…
展开
-
VS2008+DDKWIZARD加WDK基于WIN7内核编程环境配置
1、下载安装Visual Studio 2008。 2、下载安装WDKhttp://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=2105564e-1a9a-4bf4-8d74-ec5b52da3d00&u=http%3a%2f%2fdownload.m原创 2015-05-04 00:12:21 · 863 阅读 · 0 评论 -
VS2010+VMWare8+VisualDDK1.5.6环境搭建
准备工作1.win7系统32位/64位盗版2.VMware Workstation 8.0破解版3.Visual Studio 20104.Windows Driver Kit (WDK) 7.1.05.VisualDDK6.windbg调试器以上全部安装完毕 第一步d:\Program Files (x86)\VisualDDK\target\vminst原创 2015-05-17 21:43:46 · 1180 阅读 · 0 评论 -
EXE与SYS通信(直接访问模式)
EXE部分head.h#ifndef CTL_CODE#pragma message("\n \n-----------EXE . Include winioctl.h ")#include //CTL_CODE ntddk.h wdm.h#else #pragma message("\n \n----------SYS NO Include winioctl.h ")#e原创 2015-05-23 21:08:49 · 880 阅读 · 0 评论 -
NT式驱动安装卸载
TestDDK125096.sys#include void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject){ DbgPrint("Goodbye from TestDDK125096!\n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICOD原创 2015-05-20 23:19:41 · 907 阅读 · 0 评论 -
EXE与SYS通信(其他模式)
EXE部分head.h#ifndef CTL_CODE#pragma message("\n \n-----------EXE . Include winioctl.h ")#include //CTL_CODE ntddk.h wdm.h#else #pragma message("\n \n----------SYS NO Include winioctl.h ")#e原创 2015-05-23 21:36:50 · 503 阅读 · 0 评论 -
EXE与SYS通信(缓冲模式)
EXE部分head.h#include //CTL_CODE#define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,FILE_ANY_ACCESS)#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,FILE原创 2015-05-23 20:21:58 · 552 阅读 · 0 评论 -
快速分配释放内存
void LookasideTest(void){ //初始化Lookaside对象 PAGED_LOOKASIDE_LIST pageList; ExInitializePagedLookasideList(&pageList,NULL,NULL,NULL,sizeof(MYDATASTRUCT),'1234',0);#define ARRAY_NUMBER 50 PMYDAT原创 2015-07-08 23:39:23 · 432 阅读 · 0 评论 -
WinDbg+VMware调试环境搭建
一、安装VMware Workstation二、安装盗版XP系统或者盗版2003系统三、编辑系统盘目录下boot.ini,加入如下内容[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partiti原创 2015-07-04 22:40:16 · 473 阅读 · 0 评论 -
链表
#include typedef struct _MYDATASTRUCT{ ULONG number; LIST_ENTRY ListEntry;}MYDATASTRUCT,*PMYDATASTRUCT;void Unload(IN PDRIVER_OBJECT DriverObject);void LinkListTest(void);#ifdef __cpluspl原创 2015-07-05 23:20:43 · 382 阅读 · 0 评论 -
new和delete符重载
#include void Unload(IN PDRIVER_OBJECT DriverObject);#ifdef __cplusplusextern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);#endif//全局new操作符void原创 2015-07-13 23:56:53 · 333 阅读 · 0 评论 -
通过设备指针调用其他驱动程序(异步方式)
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-07 14:57:04 · 391 阅读 · 0 评论 -
通过设备指针调用其他驱动程序(同步方式)
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-07 14:42:57 · 1013 阅读 · 0 评论 -
分层驱动向下转发IRP
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-08 16:55:15 · 534 阅读 · 0 评论 -
分层驱动将IRP分解成多个IRP
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-09 13:33:32 · 437 阅读 · 0 评论 -
将应用程序的函数指针传递给驱动程序来调用
EXE部分#include #include #include #include "Ioctl.h"void Out_8(PUCHAR Port,UCHAR Value){ __asm { mov edx,Port mov al,Value out dx,al nop nop } return;}void KernelModeFunction(vo原创 2015-08-09 18:22:45 · 500 阅读 · 0 评论 -
在内核中之获取HKEY_CURRENT_USER对应路径
在内核中操作注册表,HKEY_LOCAL_MACHINE的路径可以用\Registry\Machine来表示.HKEY_USERS可以用\Registry\User表示.而HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG,HKEY_CURRENT_USER,在内核没有对应的路径来表示.实际上HKEY_CLASSES_ROOT是链接到HKEY_L转载 2015-07-18 00:32:03 · 7558 阅读 · 1 评论 -
注册表操作
#include #define MY_REG_SOFTWARE_KEY_NAME L"\\Registry\\Machine\\Software\\125096"#define MY_REG_SOFTWARE_KEY_NAME1 L"\\Registry\\Machine\\Software\\125096\\SubItem"void Unload(IN PDRIVER_OBJEC原创 2015-07-18 00:45:18 · 736 阅读 · 0 评论 -
EXE和SYS通信IOCTL方式
EXE部分#ifndef IOCTLS_H#define IOCTLS_H#ifndef CTL_CODE#pragma message("CTL_CODE undefined. Include winioctl.h or ntddk.h")#endif//缓冲内存模式IOCTL#define IOCTL_TEST1 CTL_CODE(FILE_DEVICE_UNK原创 2015-07-31 20:22:21 · 696 阅读 · 0 评论 -
EXE和SYS通信(ReadFile WriteFile) 其他方式
EXE部分#include #include int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);原创 2015-07-31 18:50:11 · 525 阅读 · 0 评论 -
EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式
EXE部分#include #include int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);原创 2015-07-31 17:24:09 · 920 阅读 · 0 评论 -
EXE和SYS通信(ReadFile WriteFile DO_BUFFERED_IO) 缓冲区方式
EXE部分#include #include int main (void){ HANDLE hDevice=CreateFile("\\\\.\\HelloDDK", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_A原创 2015-07-23 23:34:04 · 1111 阅读 · 0 评论 -
在内核下使用事件对象KeInitializeEvent
VOID MyProcessThread( IN PVOID StartContext){#if DBG _asm int 3#endif PKEVENT pEvent=(PKEVENT)StartContext; DbgPrint("11111111111111!\n"); //设置事件 KeSetEvent(pEvent,IO_NO_INCREMENT,FALSE);原创 2015-08-02 14:24:58 · 4836 阅读 · 1 评论 -
驱动程序和应用程序交换事件对象
EXE部分代码#ifndef IOCTLS_H#define IOCTLS_H#ifndef CTL_CODE#pragma message("CTL_CODE undefined. Include winioctl.h or ntddk.h")#endif//缓冲内存模式IOCTL#define IOCTL_TEST1 CTL_CODE(FILE_DEVICE_UN原创 2015-08-02 14:29:04 · 512 阅读 · 0 评论 -
内核模式下 信号灯
VOID MyProcessThread(IN PVOID pConText){#if DBG _asm int 3#endif //获取信号灯 PKSEMAPHORE pkSemaphore=(PKSEMAPHORE)pConText; //释放给定信号对象 KeReleaseSemaphore(pkSemaphore,IO_NO_INCREMENT,1,FALSE); /原创 2015-08-02 15:27:43 · 520 阅读 · 0 评论 -
内核模式下互斥体
int Number=100;VOID ThreadProc1( IN PVOID lpParameter){ PKMUTEX pkMutex=(PKMUTEX)lpParameter; while (Number>0) { KeWaitForSingleObject(pkMutex,Executive,KernelMode,FALSE,NULL); KeStallExecut原创 2015-08-02 16:46:16 · 764 阅读 · 0 评论 -
PsCreateSystemThread
HANDLE hSystemThread,hMyThread;PsCreateSystemThread(&hSystemThread,NULL,NULL,NULL,NULL,ThreadSystemStart,NULL);PsCreateSystemThread(&hMyThread,NULL,NULL,NtCurrentProcess(),NULL,ThreadUserStart,NULL)原创 2015-08-01 16:10:09 · 1061 阅读 · 0 评论 -
驱动中IRP_MJ_READ异步
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-03 19:04:52 · 2635 阅读 · 0 评论 -
自定义StartIO例程
EXE部分#include #include #include #include "Ioctl.h"DWORD ThreadProc( LPVOID lpParameter){ printf("线程执行\n"); OVERLAPPED overlap={0}; overlap.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); UCHAR原创 2015-08-04 19:02:09 · 442 阅读 · 0 评论 -
IRP的异步完成
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-04 10:55:06 · 535 阅读 · 0 评论 -
StartIO例程
StartIO例程能够保证各个并行的IRP顺序执行,即串行化并行执行与串行执行在很多情况时,对设备的操作必须是串行执行,而不能并行执行。例如,对串口的操作,假如有N个线程同时操作串口设备时,必须将这些操作排队,然后一一进行处理。如果不做串行化处理,当一个操作没有完毕时,新的操作又开始,这必然会导致操作的混乱。因此,驱动程序有必要将并行的请求变成串行的请求,这需要用到队列。可以想象,如果不原创 2015-08-04 16:51:56 · 580 阅读 · 0 评论 -
DPC定时器
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-06 09:39:44 · 621 阅读 · 0 评论 -
I/O定时器
EXE#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL, OP原创 2015-08-05 15:18:10 · 536 阅读 · 0 评论 -
驱动中四种等待的用法
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-06 10:44:43 · 1422 阅读 · 0 评论 -
IRP的超时处理
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDK"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-06 16:04:17 · 644 阅读 · 0 评论 -
驱动中以文件句柄形式调用其他驱动程序(异步调用二)
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-07 11:38:48 · 562 阅读 · 0 评论 -
win64的一些限制
Wow64不支持16位应用程序的执行,而在32位版本的windows上他们是支持的不支持加载32位内核模式的设备驱动程序,他们必须被移植为原生的64位版本Wow64进程只能加载32位dll,不能加载原生的64位dll,类似地,原生的64位进程不能加载32位dll.原创 2015-09-01 14:34:25 · 382 阅读 · 0 评论 -
驱动中以文件句柄形式调用其他驱动程序(同步调用)
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-06 20:19:51 · 526 阅读 · 0 评论 -
驱动中以文件句柄形式调用其他驱动程序(异步调用一)
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-07 10:51:20 · 778 阅读 · 0 评论 -
符号链接获得设备名
NTSTATUS status=STATUS_SUCCESS; UNICODE_STRING DeviceSymbolcLinkName; RtlInitUnicodeString(&DeviceSymbolcLinkName,L"\\??\\HelloDDKA"); //初始化objectAttributes; OBJECT_ATTRIBUTES objectAttributes;原创 2015-08-07 14:01:02 · 1006 阅读 · 0 评论 -
用IoAllocateIrp创建IRP
EXE部分#include #include #include #include "Ioctl.h"int main (void){ char linkname[]="\\\\.\\HelloDDKB"; HANDLE hDevice = CreateFileA(linkname, GENERIC_READ | GENERIC_WRITE, 0, NULL,原创 2015-08-07 15:41:22 · 2117 阅读 · 0 评论