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++程序设计有所帮助。