Skip to content

获取最后一次错误ID - GetLastError

函数简介

获取插件内部记录的最后一次错误ID,通常在某个接口调用失败后调用,用于诊断问题类型。

接口名称

GetLastError

DLL调用

c
int GetLastError();

参数说明

此函数无参数。

示例

SDK 调用

cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
int ret = ola.GetLastError();
csharp
using OLAPlug;

var ola = new OLAPlugServer();
int ret = ola.GetLastError();
python
from OLAPlugServer import OLAPlugServer

ola = OLAPlugServer()
ret = ola.GetLastError()
java
import com.olaplug.OLAPlugServer;

OLAPlugServer ola = new OLAPlugServer();
int ret = ola.GetLastError();
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
ret := ola.GetLastError()
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let ret = ola.get_last_error();
cpp
var ola = com("OlaPlug.OlaSoft")
var ret = ola.GetLastError()
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
ret = ola.GetLastError()
text
.局部变量 ola, OLAPlug
ola.创建 ()
ret = ola.GetLastError()
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var ret = ola.GetLastError();
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
整数 ret = ola.GetLastError()
cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
int32_t ret = ola.GetLastError();

原生 DLL 调用

cpp
GetLastError(instance);
csharp
using System.Runtime.InteropServices;
using System.Text;

[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetLastError();

GetLastError(instance);
python
from ctypes import CDLL, c_int, c_int64, create_string_buffer

ola = CDLL("OLAPlug_x64.dll")
ola.CreateCOLAPlugInterFace.restype = c_int64
ola.GetLastError(instance)

返回值

返回值为错误码;0 表示无错误(SUCCESS)。BindWindow / AsmCall 等接口失败时还会在自身返回值中返回负数(绝对值与对应十进制错误码相同,如 BindWindow 返回 -4001AsmCall 返回 -5005)。驱动内核错误码以有符号 int32 十进制返回(如 -1073741790-536858608),请按下文「驱动内核错误」表的 十进制(int32) 列对照。

系统性错误(10xx)

错误码常量名说明
0SUCCESS操作成功 / 无错误
1001PERMISSION_DENIED权限不足,请检查 FeatureList
1002NOT_AUTHORIZED未授权,请先登录
1003INVALID_ARGUMENT参数错误
1004VMWARE_PERMISSION_DENIEDVMware 权限不足

图像类错误(20xx)

错误码常量名说明
2001CAPTURE_ERROR截图失败
2002LOAD_IMAGE_ERROR加载图片失败
2003HWND_NOT_VALID窗口句柄无效
2004INVALID_HEX_COLOR_CODE无效的十六进制颜色代码

BindWindow / BindWindowEx 错误(40xx)

绑定失败时接口返回负数GetLastError() 返回下表错误码(正整数)。完整说明与排查见 BindWindow 错误码说明

错误码常量名说明
4001BIND_INVALID_HWND窗口句柄无效或已销毁
4002BIND_GET_PID_FAILED无法获取窗口所属进程 ID
4003BIND_INVALID_MODEdisplay/mouse/keypad 模式无效
4004BIND_NOT_ELEVATED未以管理员权限运行
4010BIND_VNC_CONNECT_FAILEDVNC 中间件连接失败
4011BIND_RDP_CONNECT_FAILEDRDP 中间件连接失败
4020BIND_SHM_CREATE_FAILED创建/打开 Hook 共享内存失败
4021BIND_HOOK_UNLOAD_BUSY目标 Hook 仍在卸载中
4022BIND_MUTEX_CREATE_FAILED创建绑定互斥量失败
4023BIND_MUTEX_LOCK_TIMEOUT获取绑定互斥量超时
4024BIND_HEARTBEAT_CONFIG_FAILEDHook 心跳/运行参数配置失败
4025BIND_DX3_IPC_PREP_FAILEDDX3 截图 IPC 预初始化失败
4030BIND_INJECT_FAILEDDLL 注入失败(通用)
4031BIND_INJECT_MEMORY_LOAD_FAILED无痕内存注入失败
4032BIND_INJECT_REMOTE_EXE_FAILEDRemoteExe 注入失败
4033BIND_INJECT_REMOTE_THREAD_FAILED远程线程注入失败
4034BIND_INJECT_TEMP_DLL_WRITE_FAILED临时 Hook DLL 写入失败
4035BIND_INJECT_HELPER_EXPORT_FAILEDinject-helper 释出失败
4036BIND_INJECT_CREATE_PROCESS_FAILED启动 inject-helper 失败
4037BIND_INJECT_DLL_NOT_FOUNDHook DLL 文件不存在
4038BIND_INJECT_DUP_MUTEX_BUSYHook 互斥量仍存在
4039BIND_INJECT_TIMEOUT注入后未检测到模块加载
4040BIND_INJECT_BUILTIN_DLL_DECODE_FAILED内置 hook_graphics 解码失败
4041BIND_INJECT_HELPER_NOT_FOUNDinject-helper 不存在
4042BIND_INJECT_OPEN_PROCESS_FAILEDOpenProcess 失败
4043BIND_INJECT_REFLECTIVE_FAILED反射注入失败
4044BIND_INJECT_DRIVER_FAILED驱动注入失败
4050BIND_HOOK_INIT_TIMEOUTHook 初始化超时
4099BIND_INTERNAL_EXCEPTION绑定内部异常

AsmCall 错误(50xx)

执行失败时接口返回负数GetLastError() 返回下表错误码(正整数)。完整说明与排查见 AsmCall 错误码说明

错误码常量名说明
5001ASM_INVALID_HWND窗口句柄无效(远程执行需有效 HWND)
5002ASM_GET_PID_FAILED无法从窗口句柄获取进程 ID
5003ASM_INVALID_TYPEtype 参数无效(有效范围 0~6)
5004ASM_EMPTY_INPUT汇编输入为空
5005ASM_ASSEMBLE_FAILED汇编编译失败
5006ASM_INVALID_MACHINE_CODE机器码格式无效
5007ASM_PARSE_MACHINE_CODE_FAILED机器码解析失败
5008ASM_EMPTY_USER_CODE生成的用户代码为空
5009ASM_ALLOC_MEMORY_FAILED分配可执行内存失败
5010ASM_ADDRESS_SPACE_INSUFFICIENT指定地址空间不足
5011ASM_REASSEMBLE_FAILED按实际地址重新汇编失败
5012ASM_CODE_SIZE_EXCEEDED重编译后代码超出可用空间
5013ASM_CODE_REGION_OVERLAP代码区与标志区重叠
5014ASM_RIP_OFFSET_OUT_OF_RANGERIP 相对偏移超出有效范围
5015ASM_WRITE_MEMORY_FAILED写入目标进程内存失败
5016ASM_DEBUG_PRIVILEGE_FAILED无法启用调试权限
5017ASM_NULL_MEMORY_CLIENT内存客户端未初始化
5018ASM_INVALID_ENTRY_POINT执行入口地址无效
5019ASM_REMOTE_THREAD_FAILED创建远程线程失败
5020ASM_EVENT_CHANNEL_FAILED注入进程事件通道调用失败
5021ASM_MAIN_THREAD_CALL_FAILED主线程排队执行失败
5022ASM_DRIVER_CALL_FAILED驱动执行汇编失败
5023ASM_EXECUTION_TIMEOUT执行超时
5024ASM_READ_RETURN_VALUE_FAILED读取返回值失败
5098ASM_FAILEDAsmCall 失败(通用)
5099ASM_INTERNAL_EXCEPTIONAsmCall 内部异常

驱动内核错误(30xx / NTSTATUS / ProtectFile / VT)

驱动内核模块相关接口失败时,可通过 GetLastError() 获取错误码;DriverTestEnableVtDriverProtectFileTestDriver接口返回值本身即为错误码。

与 BindWindow / AsmCall 的十进制 40xx / 50xx 不同,驱动错误码在接口返回值中多为 有符号 int32 负数十进制(如 -1073741790-536858608-1058471934)。这与计算器按无符号 uint32 显示的正数(如 3236495362)是同一组 32 位,可用 unchecked((uint)ret) 还原十六进制。

完整码表(含 int32 / uint32 / 十六进制三列)见 驱动错误码说明 - DriverErrorCodes

版本(30xx)

十进制(int32)十六进制常量名说明
3001DRIVER_VERSION_NOT_SUPPORTED驱动版本不支持

驱动通讯与内存(0xE000300x)

十进制(int32)十六进制常量名说明
-5368586230xE0003001DRIVER_NO_PDBPDB 解析失败
-5368586220xE0003002DRIVER_NO_OPEN打开进程失败
-5368586210xE0003003DRIVER_NO_HANDLE无效句柄
-5368586200xE0003004DRIVER_NO_MEMORY_TYPE读写类型错误
-5368586190xE0003005DRIVER_NO_ADDRESS地址错误
-5368586180xE0003006DRIVER_NO_ADDRESS_SIZE超出范围
-5368586170xE0003007DRIVER_NO_QUERMEMORY查询内存失败
-5368586160xE0003008DRIVER_NO_ALLOCATE_MEMORY申请内存失败
-5368586150xE0003009DRIVER_NO_OUTBUFF返回参数错误
-5368586140xE000300ADRIVER_NO_MAIN_THREAD获取主线程失败
-5368586120xE000300CDRIVER_NO_MODELE_ADDRESS获取模块地址失败
-5368586110xE000300DDRIVER_NO_READ_WRITE读写失败
-5368586100xE000300EDRIVER_NO_GETFUNC获取函数失败
-5368586090xE000300FDRIVER_NO_VERSION请更新版本

VT / EPT(0xE000301x,EnableVtDriver 常见)

十进制(int32)十六进制常量名说明
-5368586080xE0003010OL_ERROR_VT_NOT_SUPPORTEDCPU 不支持 VT-x 虚拟化
-5368586070xE0003011OL_ERROR_VT_DISABLEDVT-x 已被 BIOS 禁用
-5368586060xE0003012OL_ERROR_VT_ALREADY_ENABLEDVT 已经启用(重复开启)
-5368586050xE0003013OL_ERROR_VT_ENABLE_FAILEDVT 开启失败
-5368586040xE0003014OL_ERROR_VT_NOT_ENABLEDVT 未启用
-5368586030xE0003015OL_ERROR_EPT_NOT_SUPPORTEDCPU 不支持 EPT
-5368586020xE0003016OL_ERROR_EPT_INIT_FAILEDEPT 初始化失败

更多 EPT / 保护 / 注入 / 通讯错误见 驱动错误码说明

键鼠接口错误(驱动 Status / 60xx)

LeftDown / KeyDown / MoveTo 等键鼠接口失败时,接口返回值即为错误码

  • SimModeType=4:透传驱动 Status(常见 -536858583 键鼠未初始化、-536858582 发送失败;驱动加载失败时亦可能为 -1058471934 / 0xC0E90002 等 NTSTATUS)。
  • VNC/RDP/虚拟机通道未就绪:返回 -6001KEYMOUSE_BACKEND_UNAVAILABLE),GetLastError()6001
  • 参数非法(未知按键名等):返回 -1003INVALID_ARGUMENT)。

完整驱动码表见 驱动错误码说明

驱动加载 NTSTATUS(0xC000xxxx / 0xC0E9xxxx)

十进制(int32)十进制(uint32)十六进制常量名说明
-107374182332212254730xC0000001DRIVER_UNSUCCESSFUL驱动加载失败,无法具体定位原因
-107374179032212255060xC0000022DRIVER_ACCESS_DENIED权限不足,通常需要管理员或 SYSTEM 权限
-107374177232212255240xC0000034DRIVER_OBJECT_NAME_NOT_FOUND注册表路径不存在
-107374177132212255250xC0000035DRIVER_OBJECT_NAME_COLLISION注册表项或对象名冲突
-107374176632212255300xC000003ADRIVER_OBJECT_PATH_NOT_FOUND注册表路径无效
-107374172732212255690xC0000061DRIVER_PRIVILEGE_NOT_HELD缺少 SeLoadDriverPrivilege 权限
-107374170132212255950xC000007BDRIVER_INVALID_IMAGE_FORMAT驱动文件格式不正确(如 32/64 位不匹配)
-107374167032212256260xC000009ADRIVER_INSUFFICIENT_RESOURCES系统资源不足
-107374121032212260860xC0000266DRIVER_INTERNAL_ERROR驱动初始化失败,DriverEntry 出错
-105847193432364953620xC0E90002DRIVER_SYSTEM_INTEGRITY_POLICY_VIOLATION系统完整性策略拦截(HVCI/内存完整性、Smart App Control、驱动签名/代码完整性等阻止驱动加载)

文件保护驱动 ProtectFile(0xDFDFD00x)

十进制(int32)十六进制常量名说明
-5389803510xDFDFD001DRIVER_PF_ERROR_ERROR未知错误
-5389803500xDFDFD002DRIVER_PF_ERROR_NO_OPEN打开进程失败
-5389803490xDFDFD003DRIVER_PF_ERROR_NO_HANDLE无效句柄
-5389803480xDFDFD004DRIVER_PF_ERROR_INVALID_PARAM参数错误
-5389803470xDFDFD005DRIVER_PF_ERROR_PATH_TOO_LONG路径过长

其他

错误码常量名说明
9999UNKNOWN_ERROR未知错误

注意事项

项目说明
调用时机一般在接口调用失败后立即调用;中间再次调用其他接口可能覆盖错误状态。
配合使用可配合 GetLastErrorString 获取中文错误描述。
BindWindow失败返回负数,详见 BindWindow 错误码说明
AsmCall失败返回负数;成功返回 EAX/RAX(可为 0)。详见 AsmCall 错误码说明
驱动内核错误码以 十进制 int32 返回(常见负数);完整十进制/十六进制对照见 驱动错误码说明
键鼠接口SimModeType=4 透传驱动 Status;通道未就绪返回 -6001;参数非法返回 -1003