|
本帖最后由 冰点 于 2010-9-20 13:29 编辑
.版本 2
.子程序 加载驱动, 整数型, 公开, 成功返回驱动句柄,失败返回-1
.参数 驱动路径, 文本型, , sys驱动程序完整路径
.参数 服务名, 文本型, , 表示服务名称的字符串,名称中不允许使用"/"或"\"字符
.参数 显示名, 文本型, , 表示服务名称的字符串,这个名称是供用户界面程序识别函数时使用的
.参数 驱动名, 文本型, , 欲创建的驱动名,文本"\\.\"加上驱动名
.局部变量 hDevice, 整数型, , , 驱动句柄
.局部变量 hSCManager, 整数型, , , 控制管理器数据库的句柄
.局部变量 hService, 整数型, , , 服务句柄
hSCManager = OpenSCManagerA (字符 (0), 字符 (0), #SC_MANAGER_CREATE_SERVICE)
.如果真 (hSCManager = 0)
返回 (-1)
.如果真结束
hService = CreateServiceA (hSCManager, 服务名, 显示名, #SERVICE_START, #SERVICE_KERNEL_DRIVER, #SERVICE_DEMAND_START, #SERVICE_ERROR_IGNORE, 驱动路径, 0, 0, 0, 0, 0)
.如果真 (hService = 0)
hService = OpenServiceA (hSCManager, 服务名, #SERVICE_START)
.如果真 (hService = 0) ' 调用CreateService注册服务失败!
CloseServiceHandle (hSCManager)
返回 (-1)
.如果真结束
.如果真结束
StartServiceA (hService, 0, 0)
CloseServiceHandle (hService)
CloseServiceHandle (hSCManager)
hDevice = CreateFileA (驱动名, #GENERIC_READ + #GENERIC_WRITE, 0, 0, #OPEN_EXISTING, 0, 0)
返回 (hDevice) ' 返回驱动句柄
.子程序 卸载驱动, 逻辑型, 公开, 卸载驱动并删除服务,成功返回真,失败返回假
.参数 服务名, 文本型, , 表示服务名称的字符串,名称中不允许使用"/"或"\"字符
.参数 是否删除服务, 逻辑型, 可空, 为真表示删除服务
.局部变量 hService, 整数型, , , 服务句柄
.局部变量 hSCManager, 整数型, , , 控制管理器数据库的句柄
.局部变量 SERVICE_STATUS, SERVICE_STATUS
hSCManager = OpenSCManagerA (字符 (0), 字符 (0), #SC_MANAGER_CREATE_SERVICE)
.如果真 (hSCManager = 0)
返回 (假)
.如果真结束
hService = OpenServiceA (hSCManager, 服务名, #DELETE + #SERVICE_STOP)
.如果真 (hService = 0)
CloseServiceHandle (hSCManager)
返回 (假)
.如果真结束
ControlService (hService, #SERVICE_CONTROL_STOP, SERVICE_STATUS)
.如果真 (是否删除服务)
DeleteService (hService) ' 删除服务后第二次不能正常创建服务,会安装失败??
.如果真结束
CloseServiceHandle (hService)
CloseServiceHandle (hSCManager)
返回 (真)
.子程序 与驱动程序通信, 逻辑型, 公开
.参数 句柄, 整数型, , 加载驱动返回的句柄
.参数 驱动控制码, 整数型, , 与驱动程序通信的控制码,十进制
.参数 输入指针, 整数型, , 欲输入数据的指针,无用请写将此参数设置为0
.参数 输入指针长度, 整数型, , 无用请写将此参数设置为0
.参数 输出指针, 整数型, , 欲输出数据的指针,无用请写将此参数设置为0
.参数 输出指针长度, 整数型, , 无用请写将此参数设置为0
.局部变量 重叠操作_, OVERLAPPED
返回 (DeviceIoControl (句柄, 驱动控制码, 输入指针, 输入指针长度, 输出指针, 输出指针长度, 0, 重叠操作_))
.子程序 内存_驱动加载, 逻辑型, 公开
.局部变量 驱动名, 文本型
驱动名 = 取运行目录 () + “\ramint.sys”
.如果真 (写到文件 (驱动名, #驱动_内存))
驱动句柄 = 加载驱动 (驱动名, “ialdnwxf”, “ialdnwxf”, “\\.\ialdnwxf”)
.如果真 (驱动句柄 ≠ -1)
删除文件 (驱动名)
返回 (真)
.如果真结束
.如果真结束
删除文件 (驱动名)
返回 (假)
.子程序 内存_驱动卸载, 逻辑型, 公开
返回 (卸载驱动 (“ialdnwxf”, 假))
.子程序 内存_读整数, 整数型, 公开, 失败返回-1
.参数 进程ID, 整数型
.参数 内存地址, 整数型
.局部变量 内存结构, 内存结构
.局部变量 内存结构地址, 整数型
.局部变量 输出数据, 字节集
.局部变量 输出指针, 整数型
.局部变量 临时字节集, 字节集
内存结构.进程ID = 进程ID
内存结构.内存地址 = 内存地址
内存结构.欲写入值 = 0
内存结构地址 = lstrcpyn_内存结构 (内存结构, 内存结构, 0)
输出数据 = 取空白字节集 (12)
输出指针 = lstrcpyn_字节集 (输出数据, 输出数据, 0)
.如果 (与驱动程序通信 (驱动句柄, 2236416, 内存结构地址, 12, 输出指针, 12))
.否则
返回 (-1)
.如果结束
临时字节集 = 取字节集右边 (输出数据, 4)
返回 (取字节集数据 (临时字节集, 3, ))
.子程序 内存_写整数, 逻辑型, 公开, 失败返回-1,成功返回0
.参数 进程ID, 整数型
.参数 内存地址, 整数型
.参数 欲写入数据, 整数型
.局部变量 内存结构, 内存结构
.局部变量 内存结构地址, 整数型
内存结构.进程ID = 进程ID
内存结构.内存地址 = 内存地址
内存结构.欲写入值 = 欲写入数据
内存结构地址 = lstrcpyn_内存结构 (内存结构, 内存结构, 0)
返回 (与驱动程序通信 (驱动句柄, 2236421, 内存结构地址, 12, 0, 0))
.子程序 内存_读字节集, 字节集, 公开, 失败返回空字节集
.参数 进程ID, 整数型
.参数 读取地址, 整数型
.参数 读取长度, 整数型
.局部变量 返回内容, 整数型
.局部变量 i, 整数型
.局部变量 返回字节, 字节集
.局部变量 内存结构, 内存结构
.局部变量 内存结构地址, 整数型
.局部变量 输出数据, 字节集
.局部变量 输出指针, 整数型
.局部变量 临时字节集, 字节集
内存结构.进程ID = 进程ID
内存结构.欲写入值 = 0
返回字节 = { }
.如果真 (读取长度 = 0)
读取长度 = 8
.如果真结束
.计次循环首 (取整 (读取长度 ÷ 4) + 1, i)
内存结构.内存地址 = 读取地址 + (i - 1) × 4
内存结构地址 = lstrcpyn_内存结构 (内存结构, 内存结构, 0)
输出数据 = 取空白字节集 (12)
输出指针 = lstrcpyn_字节集 (输出数据, 输出数据, 0)
.如果 (与驱动程序通信 (驱动句柄, 2236416, 内存结构地址, 12, 输出指针, 12))
.否则
跳出循环 ()
.如果结束
临时字节集 = 取字节集右边 (输出数据, 4)
返回内容 = 取字节集数据 (临时字节集, 3, )
.如果真 (返回内容 ≠ -1)
返回字节 = 返回字节 + 到字节集 (返回内容)
.如果真结束
.计次循环尾 ()
返回字节 = 取字节集左边 (返回字节, 读取长度)
返回 (返回字节)
.子程序 内存_写字节集, 逻辑型, 公开
.参数 进程ID, 整数型
.参数 内存地址, 整数型
.参数 字节集数据, 字节集
.局部变量 写入内容, 整数型
.局部变量 i, 整数型
.局部变量 返回, 逻辑型
.局部变量 长度, 整数型
.局部变量 内存结构, 内存结构
.局部变量 内存结构地址, 整数型
内存结构.进程ID = 进程ID
长度 = 取字节集长度 (字节集数据)
返回 = 真
.计次循环首 (长度, i)
写入内容 = 数值_字节集到整数 (字节集数据, i)
内存结构.内存地址 = 内存地址 + i - 1
内存结构.欲写入值 = 写入内容
内存结构地址 = lstrcpyn_内存结构 (内存结构, 内存结构, 0)
.如果 (与驱动程序通信 (驱动句柄, 2236421, 内存结构地址, 12, 0, 0))
.否则
返回 = 假
跳出循环 ()
.如果结束
.计次循环尾 ()
返回 (返回)
.子程序 数值_字节集到整数, 整数型
.参数 字节集, 字节集
.参数 位置, 整数型, 可空, 默认为1
.局部变量 ret, 整数型
.局部变量 address, 整数型
.局部变量 len, 整数型
address = lstrcpyn_字节集 (字节集, 字节集, 0)
len = 取字节集长度 (字节集)
.如果真 (是否为空 (位置))
位置 = 1
.如果真结束
.如果真 (位置 > len 或 位置 < 1)
返回 (0)
.如果真结束
.如果 (len - 位置 < 4)
RtlMoveMemory_读整数 (ret, address + 位置 - 1, len - 位置 + 1)
.否则
RtlMoveMemory_读整数 (ret, address + 位置 - 1, 4)
.如果结束
返回 (ret)
驱动读写内存.rar
(8.95 KB, 下载次数: 2122)
|
|