编写InsPro Disk扩展接口
作者:陆麟
转载请征得作者同意.
2003.6.26
InsPro作为免费玩具, 已经发布了一段时间了. 今日发布了2.0版本的InsPro Disk. 此版本已经支持加密解密接口.
但是Inside Programmnig将不写作实际的加密解密插件, 仅提供样板代码, 供大家参考. 此次讲的是InsPro Disk 1.51的大体架构和USER
MODE代码接口. USER MODE的不完全代码可以在此下载.
InsPro Disk由3个部分组成.
1. USER MODE 应用程序.
提供用户界面. 与用户交互.
2. 一个INSIDE PROGRAMMING SECU-X BUS驱动.
提供一个支持动态拔插设备的BUS. 从根本上支持那些模拟设备的热拔插动作. 即使某个虚拟设备不能被动态卸载, 照样可以通过SUPERISING REMOVAL来干掉.
3. InsPro Disk的驱动. 是一个虚拟硬盘的驱动.
此处着重推出的是USER MODE应用和INSIDE PROGRAMMING SECU-X BUS驱动之间的接口.
3.1 插入硬件接口
要想模拟插入一个硬件,INSIDE PROGRAMMING SECU-X BUS驱动提供了IOCTL_SECUXBUS_PLUGIN_HARDWARE的DeviceIoControl命令.
3.1.1 INPUT参数.
INPUT BUFFER参数为PI_PLUGIN结构.
typedef struct
{
WCHAR DEVICE_ID[100];
WCHAR DeviceDesc[100];
union
{
char Misc[1000];
VIRTUAL_DISK_INFO VirtualDiskInfo;
};
}I_PLUGIN,*PI_PLUGIN;
APPLICATIONI必须指定DEVICE_ID为L"SDBUS\\DISK". 这样, InsPro Disk的驱动才会被加载.DeviceDesc则是任意的描述.
并不起作用. 从这里来看, 就可以发现, SECU-X BUS其实可以加载任何的驱动. 只要你设定正确的DEVICE ID给SECU-X BUS驱动.
甚至可以加载一个PCI DRIVER或者其他驱动.
当DEVICE_ID为L"SDBUS\\DISK"时, InsPro Disk的驱动将从VIRTUAL_DISK_INFO参数中获取加载虚拟磁盘的参数.
typedef struct
{
__int64 VitualHDDBlockCount;
char UserName[64];
char Password[64];
char Key[128];
WCHAR VitualHDDFileName[260];
}VIRTUAL_DISK_INFO,*LPVIRTUAL_DISK_INFO;
VitualHDDBlockCount表名了虚拟硬盘中到底有多少的BLOCK可以寻址. VitualHDDFileName则定义了文件名,用UNICODE表示.
此处仅支持260个WCHAR的全路径文件名. 如果用户使用了NTFS, 并且文件全路径超过了260字的限制, 将无法被加载.
char UserName[64];char Password[64]; char Key[128];则是为2.0版的加密解密功能的保留结构.
3.1. OUTPUT参数.
当插入成功, 则DeviceIoControl会返回成功. 在OUTPUT BUFFER中有一个ULONG变量, 表名虚拟硬盘被插到了哪个虚拟插槽中.
3.2 拔除虚拟硬件
要想模拟取走一个硬件,INSIDE PROGRAMMING SECU-X BUS驱动提供了IOCTL_SECUXBUS_UNPLUG_HARDWARE和IOCTL_SECUXBUS_EJECT_HARDWARE的DeviceIoControl命令.
IOCTL_SECUXBUS_EJECT_HARDWARE使用的是安全拔除接口,类似于停止USB硬盘,然后拔除的动作.
而IOCTL_SECUXBUS_UNPLUG_HARDWARE则是突然拔除接口.类似于直接拔走USB盘的动作.
3.2.1 INPUT参数
插入虚拟硬件时返回的的SLOT NUMBER.
3.2.1 OUTPUT参数
无
在不完全代码中, 有BUSLIB.CPP. 提供打开BUS驱动, 获取句柄的函数. 创建虚拟硬盘的函数, 插入,拔走虚拟硬盘的例子代码. 由于例子中没有使用到USER
NAME/PASSWORD, KEY的结构, 因此, 如果要完全支持2.0版的驱动, 需要另写界面和代码.
当然, 只要不是用于商业目的, 你也可以使用InsPro Disk的内核, 完全重写一个自己华丽的界面.
如果用于商用目的, 请联系[email protected]购买许可.