# 驱动调用使用说明

本文档说明如何在当前仓库中使用以下两个项目的驱动调用（IOCTL）功能：

- `BSPHP-Cpp-System-Card-DEMO`
- `BSPHP-Cpp-System-Login-DEMO`

## 1. 前置条件

- 使用 **管理员权限** 启动 Visual Studio / 终端。
- 已准备好可加载的驱动文件（`.sys`）。
- 驱动已实现对应设备名与 IOCTL 处理逻辑。
- 若驱动为测试签名，需开启测试模式并重启：
  - `bcdedit /set testsigning on`
  - 重启系统

## 2. 驱动与设备名约定

项目中的默认约定如下（需和你的驱动一致）：

### Card 系统演示

- 服务名：`BSPHPSystemCardDemoDrv`
- 设备名：`\\.\BSPHPSystemCardDemo`
- IOCTL：
  - `IOCTL_BSPHP_CARD_VERIFY`（功能码 `0x901`）
  - `IOCTL_BSPHP_CARD_RECHARGE`（功能码 `0x902`）

### Login 系统演示

- 服务名：`BSPHPSystemLoginDemoDrv`
- 设备名：`\\.\BSPHPSystemLoginDemo`
- IOCTL：
  - `IOCTL_BSPHP_LOGIN_PASS`（功能码 `0x911`）
  - `IOCTL_BSPHP_LOGIN_SMS`（功能码 `0x912`）

## 3. 编译与运行

分别打开并运行：

- `BSPHP-Cpp-System-Card-DEMO\BSPHP-Cpp-System-Card-DEMO.sln`
- `BSPHP-Cpp-System-Login-DEMO\BSPHP-Cpp-System-Login-DEMO.sln`

建议配置：`Debug | x64`。

## 4. 命令使用（Card）

运行 `BSPHP-Cpp-System-Card-DEMO` 后可用命令（节选）：

- `ioctl_install`
  - 输入驱动 `.sys` 完整路径
  - 执行安装/启动服务
- `ioctl_verify`
  - 发送卡密验证 IOCTL
  - 输入：`card_id`、`card_pwd`、`machine_code`
- `ioctl_recharge`
  - 发送充值 IOCTL
  - 输入：`card_id`、`recharge_no`、`recharge_pwd`

说明：该项目同时保留了完整 BSPHP API 命令（如 `verify`、`getdate`、`heart` 等），可用于对比“HTTP 业务调用”和“IOCTL 驱动调用”。

## 5. 命令使用（Login）

运行 `BSPHP-Cpp-System-Login-DEMO` 后可用命令（节选）：

- `ioctl_install`
  - 输入驱动 `.sys` 完整路径
  - 执行安装/启动服务
- `ioctl_login`
  - 发送账号密码登录 IOCTL
  - 输入：`user`、`pwd`、`machine_code`
- `ioctl_sms`
  - 发送短信登录 IOCTL
  - 输入：`mobile`、`area`、`sms_code`、`machine_code`

说明：该项目也保留了完整 BSPHP 登录链路命令（`login.lg` 等）。

## 6. 常见问题排查

- 提示 `open device failed`
  - 驱动未启动，或设备名不一致（`CreateFile` 路径与驱动创建设备名不一致）。
- `driver start fail`
  - 非管理员权限运行。
  - 驱动签名问题（测试签名未开启/证书不匹配）。
  - `.sys` 路径错误。
- IOCTL 返回 FAIL
  - 驱动未实现对应功能码。
  - 输入结构体布局与驱动端定义不一致（字段顺序、长度、字符编码）。

## 7. 结构体对齐建议

当前用户层请求结构体均使用 `wchar_t` 定长数组。驱动端建议保持同样定义，确保：

- 字段顺序一致
- 数组长度一致
- 编码一致（Unicode）

否则会出现参数解析错位。

