首页
学习
活动
专区
圈层
工具
发布

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

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

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

    内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl 是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典的驱动开发模板框架,在开发经典驱动时会用到的一个通用案例...发送传入数据的BUFFER长度(DeviceIoControl的nInBufferSize)uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength...;// EXE接收传出数据的BUFFER长度(DeviceIoControl的nOutBufferSize)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

    1.3K10

    实战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

    1.1K10

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

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

    88630

    自己写的驱动用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

    2.2K50

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

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

    1.6K30

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

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

    4.8K41

    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的地方改下

    8.2K20

    IOCTL_SERIAL_GET_HANDFLOW

    通过调用这个命令,驱动程序可以返回流控制参数,这些参数包括:使用的流控制协议、Xon字符、Xoff字符、流控制阈值等。2....SERIAL_HANDFLOW结构体当驱动程序收到IOCTL_SERIAL_GET_HANDFLOW命令时,应当将相关流控制参数填入SERIAL_HANDFLOW结构体中,再将该结构体返回给应用程序。...使用IOCTL_SERIAL_GET_HANDFLOW在应用程序中,可以通过DeviceIoControl函数发送IOCTL_SERIAL_GET_HANDFLOW命令。...;BOOL result = DeviceIoControl( hSerial, // 串口句柄 IOCTL_SERIAL_GET_HANDFLOW, // IOCTL命令代码 NULL...在调用DeviceIoControl之前,确保SERIAL_HANDFLOW结构体已经被正确初始化。检查DeviceIoControl函数的返回值,以确定操作是否成功,并根据需要进行错误处理。

    5.2K00

    Keras系列 (4)LSTM的返回序列和返回状态的区别

    (model.predict(data)) [[[ 0.00558797] [ 0.01459772] [ 0.02498127]]] 运行该范例将返回包含了"3"个值的序列,每一个隐藏状态输出会对应到每个输入时间步...返回状态 (Return States) LSTM单元或单元层的输出被称为隐藏状态。 这很令人困惑,因为每个LSTM单元保留一个不输出的内部状态,称为单元状态或"c"。...返回状态与序列 (Return States & Sequences) 我们可以同时访问隐藏状态序列和单元状态。 这可以通过配置LSTM层来返回序列和返回状态来完成。...这可以通过配置LSTM层来返回序列和返回状态来完成。...这次的LSTM该层会返回每个输入时间步的隐藏状态,然后分别返回最后一个时间步的隐藏状态输出和最后输入时间步的单元状态。

    3.8K20

    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

    2.4K22

    应用程序与驱动程序通信 DeviceIoControl

    (OutputBuffer),然后可以直接写入OutputBuffer地址,最终在驱动派遣例程返回后,由系统解除这段内存的锁定。   ...METHOD_ NEITHER方式是不进行缓冲的,在驱动中可以直接使用Ring3的输入输出内存地址,   驱动程序可以通过pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer...得到Ring3的输入缓冲区地址(其中pIrpStack是IoGetCurrentIrpStackLocation(pIrp)的返回);通过pIrp-> UserBuffer得到Ring3的输出缓冲区地址...,   //输出缓冲区  _In_         DWORD nOutBufferSize, //输出缓冲区的大小  _Out_opt_    LPDWORD lpBytesReturned, //实际返回的字节数...Io管理器    return Status;                            //Ring3 DeviceIoControl()返回值}VOID DriverUnload(PDRIVER_OBJECT

    2.4K21
    领券