C++中DeviceIoCteatol的用法实例
本文是一篇译文,主要以实例形式讲述了C++中DeviceIoCteatol的用法。分享给大家供大家参考。具体方法如下:
应用程序代码如下:
DWORDdwBytesReturned=0; BYTEbytBuffer_1[512]; BYTEbytBuffer_2[512]; CHARstring[2048]; HANDLEhDevice,hDriver; BOOLbRet; bRet=DeviceIoControl(hDriver,IOCTL_WRITE,(LPVOID)bytBuffer_1,512, NULL,0,&dwBytesReturned,NULL); if(bRet==FALSE) { printf("\nFailed-DeviceIoControl-IOCTL_WRITE.\n"); return0; } printf("\nWriteMBRusingI/Oportoperations...\n"); bRet=ReadFile(hDevice,(LPVOID)bytBuffer_1,512,&dwBytesReturned,NULL); if(bRet==FALSE) { printf("\nFailed-ReadFile-thesecondone.\n"); return0; } printf("\nReadMBRusingtheReadFilefunction...\n"); printf("----------------------------"); sprintf(string,"\n"); for(DWORDn=0;n<512;n++) { sprintf(string,"%s%02X",string,bytBuffer_1[n]); if(((n+1)%16)==0) sprintf(string,"%s\n",string); if(((n+1)%16)==8) sprintf(string,"%s-",string); } printf("%s",string); printf("----------------------------"); bRet=DeviceIoControl(hDriver,IOCTL_READ,NULL,0,(LPVOID)bytBuffer_2,512, &dwBytesReturned,NULL); if(bRet==FALSE) { printf("\nFailed-DeviceIoControl-IOCTL_READ-thesecondone.\n"); return0; } printf("\nReadMBRusingI/Oportoperations...\n"); printf("----------------------------"); sprintf(string,"\n"); for(DWORDt=0;t<512;t++) { sprintf(string,"%s%02X",string,bytBuffer_2[t]); if(((t+1)%16)==0) sprintf(string,"%s\n",string); if(((t+1)%16)==8) sprintf(string,"%s-",string); } printf("%s",string); printf("----------------------------"); printf("\nSucceed-KillHDDGMon.\n"); return1; }
驱动代码如下:
#include<ntddk.h> #defineDEVICE_NAMEL"\\Device\\KillHDDGMon" #defineLINK_NAME L"\\DosDevices\\KillHDDGMon" #defineIOCTL_WRITECTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) #defineIOCTL_READ CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS) VOIDUnload( __in struct_DRIVER_OBJECT*DriverObject ) { UNICODE_STRINGustrLinkName; DbgPrint("DriverUnload....."); RtlInitUnicodeString(&ustrLinkName,LINK_NAME); IoDeleteSymbolicLink(&ustrLinkName); IoDeleteDevice(DriverObject->DeviceObject); } NTSTATUSDispatchCreateClose( __inout struct_DEVICE_OBJECT*DeviceObject, __inout struct_IRP*Irp ) { NTSTATUSstatus=STATUS_SUCCESS; KdPrint(("DispatchCreateClose...")); Irp->IoStatus.Status=status; IoCompleteRequest(Irp,IO_NO_INCREMENT); returnstatus; } NTSTATUSDispatchIoctl( __inout struct_DEVICE_OBJECT*DeviceObject, __inout struct_IRP*Irp ) { NTSTATUSstatus=STATUS_SUCCESS; PIO_STACK_LOCATIONpIrpStack; ULONGoutSize; ULONGIoControlCode; PVOIDpIoBuffer; KdPrint(("DispatchIoctl...")); pIoBuffer=Irp->AssociatedIrp.SystemBuffer; pIrpStack=IoGetCurrentIrpStackLocation(Irp); outSize=pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; IoControlCode=pIrpStack->Parameters.DeviceIoControl.IoControlCode; switch(IoControlCode) { caseIOCTL_WRITE: __asm { pusheax pushedx //--------------------------------------------------- //以下代码用I/O端口来写主引导区 movdx,1f6h//要读入的磁盘号及磁头号 moval,0a0h//磁盘0,磁头0 outdx,al movdx,1f2h//要写的扇区数量 moval,1 //写一个扇区 outdx,al movdx,1f3h//要写的扇区号 moval,1 //写到1扇区 outdx,al movdx,1f4h//要写的柱面的低8位 moval,0 //低8位为0 outdx,al movdx,1f5h//要写的柱面的高2位 moval,0 //高2位为0 outdx,al movdx,1f7h//命令端口 moval,30h //尝试着写扇区 outdx,al still_going_1: inal,dx testal,8 //如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行 jzstill_going_1 popedx popeax } WRITE_PORT_BUFFER_USHORT((PUSHORT)0x1f0,(PUSHORT)pIoBuffer,256); status=STATUS_SUCCESS; break; caseIOCTL_READ: if(outSize>=512) { __asm { pusheax pushedx //--------------------------------------------------- //以下代码用I/O端口来读主引导区 movdx,1f6h//要读入的磁盘号及磁头号 moval,0a0h//磁盘0,磁头0 outdx,al movdx,1f2h//要读入的扇区数量 moval,1 //读一个扇区 outdx,al movdx,1f3h//要读的扇区号 moval,1 //扇区号为1 outdx,al movdx,1f4h//要读的柱面的低8位 moval,0 //柱面低8位为0 outdx,al movdx,1f5h//柱面高2位 moval,0 //柱面高2位为0(通过1F4H和1F5H端口我们可以确定用来读的柱面号是0) outdx,al movdx,1f7h//命令端口 moval,20h //尝试读取扇区 outdx,al still_going_2: inal,dx //扇区缓冲是否准备好 testal,8 //如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。 jzstill_going_2 /* movcx,512/2 //设置循环次数(512/2次) movdi,offsetbuffer movdx,1f0h//将要传输的一个字节的数据 repinsw //传输数据 */ //--------------------------------------------------- popedx popeax } READ_PORT_BUFFER_USHORT((PUSHORT)0x1f0,(PUSHORT)pIoBuffer,256); status=STATUS_SUCCESS; } else { Irp->IoStatus.Information=0; status=STATUS_BUFFER_TOO_SMALL; } break; } Irp->IoStatus.Status=status; IoCompleteRequest(Irp,IO_NO_INCREMENT); returnstatus; } NTSTATUSDriverEntry( __in struct_DRIVER_OBJECT*DriverObject, __in PUNICODE_STRINGRegistryPath ) { NTSTATUSstatus=STATUS_SUCCESS; UNICODE_STRINGustrDevName; UNICODE_STRINGustrLinkName; PDEVICE_OBJECT pDevObj=NULL; DriverObject->DriverUnload=Unload; DriverObject->MajorFunction[IRP_MJ_CREATE]=DispatchCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE]=DispatchCreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchIoctl; RtlInitUnicodeString(&ustrDevName,DEVICE_NAME); status =IoCreateDevice(DriverObject,0,&ustrDevName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDevObj); if(!NT_SUCCESS(status)) { returnstatus; } RtlInitUnicodeString(&ustrLinkName,LINK_NAME); status=IoCreateSymbolicLink(&ustrLinkName,&ustrDevName); if(!NT_SUCCESS(status)) { IoDeleteSymbolicLink(&ustrLinkName); returnstatus; } returnstatus; }
希望本文所述对大家的C++程序设计有所帮助。