阅读:1603回复:7
DeviceIoControl的问题
我的程序如下
//fileio.c #include \"fileio.h\" NTSTATUS DeviceDispatch(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) { NTSTATUS ns = STATUS_SUCCESS; ULONG info = 0; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp); switch (stack->MajorFunction) { case IRP_MJ_CREATE: //case IRP_MJ_CLEANUP: // case IRP_MJ_CLOSE: // { // ns = STATUS_SUCCESS; // break; // } case IRP_MJ_DEVICE_CONTROL: { SPY_CPU_INFO sci; PSPY_CPU_INFO psci = &sci; __asm { push eax push ebx mov ebx, psci mov eax, cr0 mov [ebx.cr0], eax pop ebx pop eax } RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer, &sci, stack->Parameters.DeviceIoControl.OutputBufferLength = SPY_CPU_INFO_); break; } } pIrp->IoStatus.Status = ns; pIrp->IoStatus.Information = SPY_CPU_INFO_; IoCompleteRequest (pIrp, IO_NO_INCREMENT); return ns; } NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegisterPath) { NTSTATUS status; UNICODE_STRING devname; PDEVICE_OBJECT fdo; RtlInitUnicodeString(&devname, L\"\\\\Device\\\\fileio\"); pDriverObject->MajorFunction[IRP_MJ_CREATE] = pDriverObject->MajorFunction[IRP_MJ_CLOSE] = pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceDispatch; status = IoCreateDevice(pDriverObject, 0, &devname, FILE_DEVICE_SPY, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo); if(!NT_SUCCESS(status)) { KdPrint((\"IoCreateDevice failed - %X\\n\", status)); return status; } return STATUS_SUCCESS; } //test.c #include <stdio.h> #include \"test.h\" BOOL WINAPI IoControl (HANDLE hDevice, DWORD dCode, PVOID pInput, DWORD dInput, PVOID pOutput, DWORD dOutput) { DWORD junk; if (DeviceIoControl(hDevice, dCode, pInput, dInput, pOutput, dOutput, &junk, NULL)) { return true; } else printf(\"Error %d in call to DeviceIoControl\\n\", GetLastError()); CloseHandle(hDevice); return true; } BOOL WINAPI ReadCpuInfo (HANDLE hDevice, PSPY_CPU_INFO psci) { return IoControl (hDevice, IOCTL_READ_FILE, NULL, 0, psci, SPY_CPU_INFO_); } int main() { SPY_CPU_INFO sci; DWORD th = 0 ; char path[MAX_PATH]; char *temp = 0; // BOOL result; GetFullPathName(\"fileio.sys\", sizeof(path), path, &temp); HANDLE hdevice = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hdevice == INVALID_HANDLE_VALUE) { printf(\"Unable to open FILEIO device - error %d\\n\", GetLastError()); return 1; } ReadCpuInfo (hdevice, &sci); //result = DeviceIoControl(hdevice, IOCTL_READ_FILE, // NULL, 0, // &sci, SPY_CPU_INFO_, &th, NULL); printf(\"%x\\n\", sci.cr0); return true; } 为什么调用DeviceIoControl时,总提示参数错误,可我检查了 没有问题呀? |
|
|
沙发#
发布于:2005-03-11 21:34
你没有创建SYMBOLIC吗??你是如何CREATEFILE的??
|
|
|
板凳#
发布于:2005-03-11 21:53
Createfile的第一个参数不对
查看msdn看看打开一个device是一个什么样子的参数 你这样调用打开的不是device而是那个文件 而且如同wowocock说的 你都没有创建符号链接 |
|
地板#
发布于:2005-03-12 08:49
看这个帖子
http://www.driverdevelop.com/forum/html_88325.html?1110588537 |
|
|
地下室#
发布于:2005-03-13 12:31
我RtlInitUnicodeString(&devname, L\"\\\\Device\\\\fileio\");
RtlInitUnicodeString(&sldevname, L\"\\\\Device\\\\slfileio\"); IoCreateSymbolicLink(&sldevname, &devname); 后,在执行device.inf文件,出现 Error2,UpdateDeviceForPlugAndPlayDevices:系统找不道指定的 文件,这又是为什么呢? |
|
5楼#
发布于:2005-03-13 12:35
我的device.inf 如下
[Version] Signature=$CHICAGO$ Class=Sample ClassGuid={894A7460-A033-11d2-821E-444553540000} Provider=%MFGNAME% [Manufacturer] %MFGNAME%=DeviceList [DestinationDirs] DefaultDestDir=10,System32\\Drivers [SourceDisksFiles] fileio.sys=1 [SourceDisksNames] 1=%INSTDISK%,,,objchk\\i386 [DeviceList] %DESCRIPTION%=DriverInstall,*WCO0904 ;------------------------------------------------------------------------------ ; Windows 2000 Sections ;------------------------------------------------------------------------------ [DriverInstall.NT] CopyFiles=DriverCopyFiles [DriverCopyFiles] fileio.sys,,,2 [DriverInstall.NT.Services] AddService=fileio,2,DriverService [DriverService] ServiceType=1 StartType=3 ErrorControl=1 ServiceBinary=%10%\\system32\\drivers\\fileio.sys [DriverInstall.nt.hw] AddReg=DriverHwAddReg ;------------------------------------------------------------------------------ ; Windows 98 Sections ;------------------------------------------------------------------------------ [DriverInstall] AddReg=DriverAddReg CopyFiles=DriverCopyFiles [DriverAddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,fileio.sys [DriverInstall.hw] AddReg=DriverHwAddReg ;------------------------------------------------------------------------------ ; String Definitions ;------------------------------------------------------------------------------ [Strings] MFGNAME=\"Walter Oney Software\" INSTDISK=\"WDM Book Companion Disc\" DESCRIPTION=\"fileio Sample Device\" |
|
6楼#
发布于:2005-03-16 17:32
终于解决了,谢谢各位
|
|
7楼#
发布于:2005-05-09 20:13
ok
|
|