本人不懂 驱动核心编程 网上下了一个 sys文件 还有源代码 用的是 DeviceIoControl 来和应用层通信
但是 DeviceIoControl 每次都说参数不正确
代码如下
OpenDevice(g_szDriverName,&hDevice); 这个函数显示成功的,hDevice也有值
success = DeviceIoControl(hDevice,
IO_INSERT_HIDE_PROCESS,
(void*)&dwProcessId,
4,
NULL,
0,
&d_bytesRead,
NULL);
DeviceIoControlDispatcher(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) 这个好像是分发函数 用来处理消息
代码如下
NTSTATUS rtStatus;
ULONG uPID;
ULONG uInLen;
ULONG uOutLen;
ULONG uCtrlCode;
PCHAR pInBuffer;
PIO_STACK_LOCATION pStack;
uPID = 0;
rtStatus = STATUS_SUCCESS;
pStack = IoGetCurrentIrpStackLocation(pIrp);
uInLen = pStack->Parameters.DeviceIoControl.InputBufferLength;
uOutLen = pStack->Parameters.DeviceIoControl.OutputBufferLength;
uCtrlCode = pStack->Parameters.DeviceIoControl.IoControlCode;
//使用缓冲区方式与应用程序进行通信
pInBuffer = (PCHAR)pIrp->AssociatedIrp.SystemBuffer;
if(uInLen >= 4)
{
//stdlib.h(atol = Array To LONG)
uPID = atol(pInBuffer);
switch(uCtrlCode)
{
case IO_INSERT_PROTECT_PROCESS:
{
if(InsertProtectProcess(uPID) == FALSE)
{
rtStatus = STATUS_PROCESS_IS_TERMINATING;
}
break;
}
default:
{
rtStatus = STATUS_INVALID_VARIANT;
break;
}
}
}
else
{
rtStatus = STATUS_INVALID_PARAMETER;
}
//输出信息总是为空,即该驱动程序不返回输出信息
pIrp->IoStatus.Status = rtStatus;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
不知道 是什么原因 还有一个小问题 我现在CreateFile 用的是绝对路径 但是驱动好像有符号链接了
#define DEVICE_NAME_PROCESS L"\\Device\\SSDT01ByZachary"
#define SYMBOLINK_NAME_PROCESS L"\\??\\SSDT01ByZachary"
RtlInitUnicodeString(&strDeviceName, DEVICE_NAME_PROCESS);
RtlInitUnicodeString(&strSymbolLinkName, SYMBOLINK_NAME_PROCESS);
status = IoCreateDevice(pDriverObject, 0, &strDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject);
if (!NT_SUCCESS(status))
{
return status;
}
这里是什么意思 我把生的SYS文件改名了 而且我安装服务的时候的名字也和strDeviceName 不一样 这个有关系吗
StartServer 是成功的 而且我也确实看到启动了 这个和 DriverEntry 返回失败有关系吗?
不好意思 问题有点多 但是有点急 没办法去学习了 大家帮帮忙吧!
------解决方案--------------------
注意参数类型