首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OpenProcess打开进程返回错误问题

问题描述       项目中需要做一个小功能:能够查看系统中当前正在运行进程内存信息,如内存块类型、分配状态、访问权限等。如下图所示:       需要信息和上图相差无几。...于是乎,打开调试器下了几个断点跟了进去发现:GetLastError()返回值在遇到System Process时,会返回错误代码87。...回头一查MSDN,人家已然说明:当OpenProcess()给定进程ID为0时,该函数会失败并且GetLastError()返回错误代码是ERROR_INVALID_PARAMETER。...另外还说明了,当给定进程是空闲进程(Idle Process)或CSRSS进程之一时,GetLastError()返回错误代码是ERROR_ACCESS_DENIED,其值为5....= ERROR_ACCESS_DENIED) return; // function failed for other errors } else { if ( GetProcessMemoryInfo

3.2K100
您找到你想要的搜索结果了吗?
是的
没有找到

驱动开发:应用DeviceIoContro开发模板

内核中执行代码后需要将结果动态显示给应用层用户,DeviceIoControl 是直接发送控制代码到指定设备驱动程序,使相应移动设备以执行相应操作函数,如下代码是一个经典驱动开发模板框架,在开发经典驱动时会用到一个通用案例...发送传入数据BUFFER长度(DeviceIoControlnInBufferSize)uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength...;// EXE接收传出数据BUFFER长度(DeviceIoControlnOutBufferSize)uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength...*lpBytesReturned值(如果通信失败则返回0长度)if (status == STATUS_SUCCESS)pIrp->IoStatus.Information = uOutSize;elsepIrp...->IoStatus.Information = 0;// 设定DeviceIoControl返回值是成功还是失败pIrp->IoStatus.Status = status;IoCompleteRequest

76710

驱动开发:应用DeviceIoContro开发模板

内核中执行代码后需要将结果动态显示给应用层用户,DeviceIoControl 是直接发送控制代码到指定设备驱动程序,使相应移动设备以执行相应操作函数,如下代码是一个经典驱动开发模板框架,在开发经典驱动时会用到一个通用案例...; // EXE发送传入数据BUFFER长度(DeviceIoControlnInBufferSize) uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength...; // EXE接收传出数据BUFFER长度(DeviceIoControlnOutBufferSize) uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength...*lpBytesReturned值(如果通信失败则返回0长度) if (status == STATUS_SUCCESS) pIrp->IoStatus.Information = uOutSize...; else pIrp->IoStatus.Information = 0; // 设定DeviceIoControl返回值是成功还是失败 pIrp->IoStatus.Status =

97730

应用层,驱动层,硬件层_windows组件向导在哪里

返回失败,可是驱动层明明收到数据了 因为没有把返回值status调整为STATUS_SUCCESS,只是等于了一个初始化不会STATUS_SUCCESS值 3.DeviceIoControl传到驱动层了...驱动返回数据时,也是向pIrp->AssociatedIrp.SystemBuffer中写入,操作系统会将数据复制到DeviceIoControloutBuffer,复制字节数是pIrp->IoStatus.Information...uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; 设置返回数据代码如下 wcscpy_s((WCHAR*...中inBuffer数据被复制到IRP中pIrp->AssociatedIrp.SystemBuffer,复制长度是DeviceIoControl指定nInBufferSize。...派遣函数中IRP中pIrp->MdlAddress记录DeviceIoControl指定输出缓冲区。

49230

自己写驱动用CreateFile打开时错误码返回1问题

类型IRP,系统根据函数所针对设备(这个设备可以通过第一个参数知道)找到对应驱动,然后调用驱动中对应处理函数,然后将这个处理函数中返回返回给I/O管理器,I/O管理器根据这个值决定如何返回值给应用层...当时我推测可能是句柄为NULL,或者DeviceIoControl中哪个缓冲区不能为NULL,为了知道是哪问题,我在调用DeviceIoControl之前加了一条输出语句,我发现这条语句输出句柄值是正常...,那就肯定是DeviceIoControl问题,我先试着吧所有的输入输出缓冲区都给定了一个值,通过排查最后发现是倒数第二个参数不能为NULL,这个参数表示是驱动层实际返回缓冲区大小。...这就要说到DeviceIoControl与驱动通信方式,DeviceIoControl定义如下: BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode...DeviceIoControl函数,如果不需要跟驱动层进行交互,那么他输入输出缓冲区是可以给NULL,但是由于I/O管理器会像它返回驱动层实际返回数据大小,所以这个真实大小缓冲区一定不能为NULL

1.5K50

实战DeviceIoControl 之中一个:通过API訪问设备驱动程序

A 在NT/2000/XP中,应用程序能够通过API函数DeviceIoControl来实现对设备訪问—获取信息,发送命令,交换数据等。...DeviceIoControl函数原型为 BOOL DeviceIoControl( HANDLE hDevice, // 设备句柄 DWORD dwIoControlCode...x=0,1,2 …… 其他设备名称需通过驱动接口GUID调用设备管理函数族取得,这里暂不讨论。 Q 请举一个简单样例说明怎样通过DeviceIoControl訪问设备驱动程序。...A 这里有一个从MSDN上摘抄来demo程序,演示在NT/2000/XP中怎样通过DeviceIoControl获取硬盘基本參数。...如今我们总结一下通过DeviceIoControl訪问设备驱动程序“三步曲”:首先用CreateFile取得设备句柄,然后用DeviceIoControl与设备进行I/O,最后别忘记用CloseHandle

63010

golang | 是返回struct还是返回struct指针

当我们定义一个函数时,是返回结构体呢,还是返回指向结构体指针呢? 对于这个问题,我想大部分人回答,肯定都是返回指针,因为这样可以避免结构体拷贝,使代码效率更高,性能更好。 但真的是这样吗?...上图中,函数f返回是结构体S指针,即一个地址,这个可以通过其汇编来确认: ? 看上图中选中行。 第一行是调用函数f,其结果,即结构体S指针,或结构体S地址,是放到ax寄存器中返回。...我们再来看下返回结构体情况: ? 这次函数f返回是S,而不是*S,看看这样写其汇编是什么样子: ?...在函数f返回后,sp寄存器存放,正是函数f初始化结构体S地址。...经过测试,1MiB字节以下,返回结构体都更有优势。 那返回指针方式是不是没用了呢?

3.5K41

64位内核开发第一讲,IRP 派遣函数 与 通信。 驱动框架补充

ULONG ByteOffset;//记录相对于页偏移 } MDL, *PMDL; MmGetMdlVirtualAddress 返回 MDL 描述 i/o 缓冲区虚拟内存地址...MmGetMdlByteCount 返回 i/o 缓冲区大小(以字节为单位)。 MmGetMdlByteOffset 返回 i/o 缓冲区开始处物理页内偏移量。...这个 WinApi来与内核进行通讯 通讯前提是我们需要使用 CreateFile 来打开我们内核提供 符号链接 打开成功后返回 对象句柄 我们 DeviceIoControl 就可以来通过这个对象句柄来与内核进行通讯了...nOutBufferSize 输出缓冲区大小 lpBytesReturned 传递给内核层4字节变量,来接受返回。内核层可设置返回值。一般都是记录 读取/写入 多少字节。内核层设置。...DeviceIoControl->Type3InputBuffer 记录着输入缓冲区 Irp->UserBuffer 记录着输出缓冲区 其中输入输出缓冲区长度还是在 DeviceIoControl

1.1K22

php递归函数返回返回不出问题

data);         return $data;     } } 控制器代码如下 var_dump(get_cat_pid($cat_parent_id,array())); 发现无论如何,函数打印结果是正确...,到return时候只能打印一个null,一直改都没法解决 后来想到了存session,存session的确解决了,但感觉非常不好 直到我度娘到了&$这个东西, 百度一下释义,说是引用变量 $b=&...return;     }else{         return;     } } get_cat_pid($cat_parent_id,$a);   var_dump($a); 解决了递归函数传值不出问题...经过了大神教诲,现在终于明白为什么会返回null了 函数return是返回给调用这个函数值,当循环两次值为0时,会返回给循环第一次本身函数,然后再返回给调用函数... 大神原话 ?...顺便把前面没有return地方改下

4.5K20

内核事件 KEVENT 实现驱动与应用层通讯

g_Event 会被设置为有信号状态,接下来就到我们处理应用层使用 DeviceIoControl 在驱动中响应功能了。...我们设置了一个无限循环,一直从链表中取数据,若取出数据为 NULL,则等待 g_Event,当 g_Event 为有信号状态时,证明有新进程创建了,那么 KeWaitForSigleObject 立即返回执行下一次循环...,同时该事件被设置为有信号状态 // 随后 KeWaitForSingleObject 返回继续执行循环,继续执行时就可以取到新节点数据了...通过 CreateFile 打开设备,并调用 DeviceIoControl 函数向驱动发送一个接收数据请求。...一旦 g_Event 被设置为有信号状态,则 KeWaitForSingleObject 返回,拷贝数据给应用层提供 Buffer,应用层接收数据打印。

49420

派遣函数

等函数产生,最简单做法是将IRP设置为成功,然后结束IRP请求,并让派遣函数返回成功,结束这个IRP调用函数IoCompleteRequest。...); 其实当应用层调用相关函数进行I/O操作时,会陷入睡眠或者阻塞状态,等待派遣函数成功返回,当派遣函数返回时会唤醒之前等待线程,而第二个参数就是制定这个被唤醒线程以何种优先级别运行。...分别获取读写缓冲区长度 IO设备控制操作 DeviceIoControl与驱动设备交互 BOOL DeviceIoControl( HANDLE hDevice, //驱动对象句柄 DWORD...,只有当驱动向I/O管理器返回一个成功时候才会为其分配句柄,所以驱动中需要自己实现Create分发派遣函数。...默认情况下我们会在结束IOControl这个IRP时候会给定一个返回长度为0,这个时候I/O管理器会将这个值回填到DeviceIoControl函数中倒数第二个参数中,因此DeviceIoControl

70810

CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信

Ring3层CreateFile函数获取了设备句柄后,将使用DeviceIoControl函数向指定设备驱动发送一个IO控制码,驱动程序通过这个控制码来完成特定工作。..., //输出缓冲区大小 _Out_opt_ LPDWORD lpBytesReturned, //实际返回字节数,对应驱动程序中pIrp->IoStatus.Information。...在驱动层,IoStackLocation->Parameters.DeviceIoControl.IoControlCode表示了这个控制码。发送不同控制码,可以调用设备驱动程序不同类型功能。...lpOutBuffer 由用户层指定,用于接收驱动层返回数据缓冲区。在驱动层,依传输类型不同,输出缓冲区位置亦不同,见下表。...METHOD_BUFFERED irp->AssociatedIrp.SystemBuffer METHOD_NEITHER irp->UserBuffer nOutBufferSize 由用户层指定,用于接收驱动层返回数据缓冲区大小

1.9K30
领券