NellInc/Janus
GitHub: NellInc/Janus
Janus 是一个通用双向 NT/9x 驱动程序翻译框架,解决在 Windows 9x 上加载 Windows NT 内核驱动程序的不兼容问题。
Stars: 2 | Forks: 0
# Janus:通用双向 NT/9x 驱动程序翻译框架
**在 Windows 9x 上加载 Windows NT 内核模式驱动程序。支持任意 NT 版本与任意架构。**
Janus 是一个驱动程序翻译框架,旨在桥接 Windows NT 内核模式驱动程序(.sys PE 文件)与 Windows 9x VxD 子系统之间的根本性不兼容。它在 Win98 VxD 封装器内加载、重定位、解析导入并执行未经修改的 NT 驱动程序,跨越了 12 年的 Windows 历史和三种 CPU 架构。
其名源于罗马神话中的门神、过渡与通道之神——常被描绘为两张面朝相反方向的脸。Janus 主宰着不兼容内核架构之间的通道,连接了 NT 的起始(3.1,1993年)与 9x 的终结(ME,2000年)。
## 已验证成果
**跨越 3 种架构和 12 年时间跨度,成功加载了 19 个驱动程序:**
| # | 时代 | 驱动程序 | 类别 | 结果 |
|---|------|----------|------|------|
| 1 | XP SP3 | sym_hi.sys (LSI 53C810) | SCSI | 9/9 扇区读写成功 |
| 2 | XP SP3 | rtl8029.sys (NE2000 PCI) | NDIS 4.0 | 完整 ARP 收发 |
| 3 | XP SP3 | rtl8139.sys (Realtek) | NDIS 5.0 | 完整 ARP 收发 |
| 4 | XP SP3 | ne2000.sys | NDIS 3.0 | 完整 ARP 收发 |
| 5 | XP SP3 | vga.sys (21K) | VideoPort | DriverEntry + 初始化 |
| 6 | XP SP3 | hidparse.sys (25K) | ntoskrnl | DriverEntry + 30 个导出 |
| 7 | XP SP3 | hidgame.sys (9K) | HID | DriverEntry + HidRegister |
| 8 | XP SP3 | es1371mp.sys (41K) | PortCls | 60/60 个导入已解析 |
| 9 | XP x64 | hidparse.sys (41K) | AMD64 PE32+ | 加载 + 导入 |
| 10 | XP x64 | pciide.sys (6K) | AMD64 PE32+ | 加载 + PCIIDEX |
| 11 | XP x64 | hidgame.sys (12K) | AMD64 PE32+ | 加载 + HIDCLASS |
| 12 | XP x64 | vgapnp.sys (33K) | AMD64 PE32+ | 加载 + VideoPort |
| 13 | XP x64 | ne2000.sys (22K) | AMD64 PE32+ | 加载 + NDIS |
| 14 | NT 3.51 | aha154x.sys (9K) | ScsiPort | 加载 + 17/17 个导入 |
| 15 | NT 3.1 | aha154x.sys (15K) | ScsiPort | 加载 + 全部导入 |
| 16 | NT 3.51 | buslogic.sys (8.5K) | ScsiPort | 加载 + ScsiPort |
| 17 | NT 3.51 | ncr53c9x.sys (12K) | ScsiPort | 加载 + ScsiPort |
| 18 | XP IA-64 | pciide.sys (6.7K) | Itanium PE32+ | 加载 + PCIIDEX |
## 架构
```
Win98 Guest
─────────────────────────────────────────
NTMINI.VXD (single LE object, SYSTEM.INI loaded)
├── PE Loader (PELOAD.C, 1809 lines)
│ ├── PE32 (i386, 0x014C) — full load + execute
│ ├── PE32+ (AMD64, 0x8664) — full load + import resolution
│ ├── PE32+ (IA-64, 0x0200) — full load + import resolution
│ └── Multi-DLL import resolution via shim registry
│
├── NTOS_SHIM.C (2077 lines, 130+ stubs)
│ ├── ntoskrnl.exe: memory, sync, timer/DPC, IRP, power,
│ │ string, registry, object, thread, CRT functions
│ └── HAL.dll: port I/O, MMIO, spinlocks, IRQL, timing
│
├── Class Shims:
│ ├── ScsiPort → IOS VxD bridging (HDD/CD-ROM read/write)
│ ├── NDIS → Direct packet TX/RX (ARP send+receive)
│ ├── VideoPort → PCI GPU, VGA regs, Int10 V86, PCI BAR scan
│ ├── HID → HidRegisterMinidriver
│ ├── PCI IDE → PciIdeXInitialize/GetBusData/SetBusData
│ ├── PortCls → COM vtable stubs (WDM audio)
│ └── 6 more written (USB, DirectDraw, WiFi, AGP, Joystick)
│
└── VxD Infrastructure (VXDWRAP_V4.ASM, 2700 lines)
├── VMM service wrappers, DDB, control dispatch
├── Safe_HwFindAdapter (IDT fault catching)
├── VxD_PageAllocateDMA (contiguous physical memory)
├── Win9x page table self-map (PDE 0x3FE) for DMA VA→PA
├── V86 nested execution (INT 10h BIOS calls)
└── PCI config space (0xCF8/0xCFC)
```
## 关键发现:Win9x 上的 DMA
Win9x 将递归页表映射到 PDE 索引 0x3FE,而非像 NT 那样是 0x3FF:
```
// Page directory at VA 0xFFBFE000 (not 0xFFFFF000)
// Page tables at VA 0xFF800000 (not 0xFFC00000)
volatile ULONG *pde = (volatile ULONG *)(0xFFBFE000 + (va >> 22) * 4);
if (*pde & 1) {
volatile ULONG *pte = (volatile ULONG *)(0xFF800000 + (va >> 12) * 4);
if (*pte & 1) return (*pte & 0xFFFFF000) | (va & 0xFFF);
}
```
在 Win98 上,所有用于 VA 到 PA 转换的 VMM 服务均失败。自映射是唯一可行的方法。
## 构建指南
### 前置条件
- Docker(用于包含 Open Watcom 2.0 + NASM 的 `ntmini-builder` 镜像)
- Python 3
- QEMU(用于 LSI 修复的定制版本,或用于非 SCSI 测试的原版)
- Windows 98 SE 磁盘映像(FAT32)
### 构建
```
cd source/
# SCSI(sym_hi.sys,LSI 53C810):
docker run --rm -v "$PWD:/src" -v "$PWD/../builds:/out" \
ntmini-builder:latest sh -c "cd /src && \
nasm -f obj -o /out/V5FULL_asm.obj VXDWRAP_V4.ASM && \
wcc386 -bt=windows -3s -s -zl -d0 -nc=LCODE -nt=_LTEXT -nd=_LDATA \
-zc -zdp -dNTMINI_USE_SCSI=1 NTMINI_V5.C -fo=/out/V5_c.obj && \
wcc386 ... PELOAD.C -fo=/out/V5_pe.obj && \
cd /out && wlink @link_script.lnk"
python3 ../tools/le_merge_objects.py builds/OUTPUT.VXD builds/MERGED.VXD
```
构建模式:SCSI (1,2), NDIS (3), VideoPort (4), 通用测试 (5)。
## NT 版本支持
| 版本 | 年份 | 架构 | 状态 |
|------|------|------|------|
| NT 3.1 | 1993 | i386 | PE 加载已验证 (aha154x.sys) |
| NT 3.5 | 1994 | i386 | 提取了 146 个驱动,未测试 |
| NT 3.51 | 1995 | i386 | PE 加载已验证 (3 个 SCSI 驱动) |
| NT 4.0 | 1996 | i386 | 兼容 (相同的 ScsiPort API) |
| Windows 2000 | 2000 | i386 | 兼容 (NT5,与 XP 相同的 API) |
| Windows XP SP3 | 2005 | i386 | 8 个驱动已验证 (SCSI/NDIS/Video/HID/Audio) |
| Windows XP x64 | 2005 | AMD64 | 5 个驱动 PE32+ 加载成功 |
| Windows XP IA-64 | 2003 | Itanium | 1 个驱动 PE32+ 加载成功 |
## Win9x 目标支持
| 目标 | 状态 |
|------|------|
| Windows 98 SE | 主要目标,所有测试均在此进行 |
| Windows ME | 预期可用(相同的 VxD 架构),未测试 |
| Windows 95 | 相同的 VxD 格式,需验证 VMM 差异 (PDE 索引,PageAllocate) |
## 驱动类别覆盖
| 类别 | 垫片 | 函数数量 | 状态 |
|------|------|----------|------|
| ScsiPort (SCSI 存储) | NTMINI_V5.C | 22+ | 已验证 (读写) |
| NDIS (网络) | NDIS_SHIM.C | 75+ | 已验证 (收发) |
| VideoPort (显示) | VIDEO_SHIM.C | 47+ | 已验证 (初始化) |
| ntoskrnl/HAL | NTOS_SHIM.C | 130+ | 已验证 |
| HID | HID_SHIM.C | 3 | 已验证 |
| PCI IDE | PCIIDE_SHIM.C | 3 | 已验证 |
| PortCls (音频) | AUDIO_SHIM.C | 20+ | 部分完成 |
| USBD (USB) | USB_SHIM.C | 15 | 已编写 |
| DirectDraw/D3D | DDRAW_SHIM.C | 15+ | 已编写 |
| 802.11 WiFi | WIFI_SHIM.C | 8 | 已编写 |
| AGP | AGP_SHIM.C | 10 | 已编写 |
| 游戏杆 | JOYSTICK_SHIM.C | 5 | 已编写 |
## 路线图
### 近期目标
- Windows 95 和 Windows ME 测试
- 更多 IA-64 Itanium 驱动程序 (ne2000, vga)
- VideoPort Int10 时序修复(将 V86 延迟到 Init_Complete)
- 用于真实网络的 NDIS 到 Win98 TCP/IP 桥接
- 来自 NT 3.51/4.0 的 MIPS (0x0166) 和 Alpha AXP (0x0184) 架构支持
### 中期目标
- 双向支持:在 NT 上运行 Win9x VxD 驱动程序(VxD-on-NT 加载器)
- 从文件系统运行时加载驱动程序(绕过 VxD 大小限制)
- 完整的 WDM IRP 栈以支持复杂驱动程序
- 真实硬件测试(超越 QEMU)
## 项目历史
最初为解决 [Vogons 复古计算社区](https://vogons.org) 在 Windows 98 上使用 NEC ATAPI 控制器的 CD-ROM 驱动问题而开发。后发展为一个覆盖完整 NT 驱动生态系统的通用驱动程序翻译框架。
在 2026 年 3 月至 5 月的三个月开发过程中,约消耗了 2 亿 token 的 Claude (Opus 4.6) 逆向工程算力。
## 许可证
MIT 许可证。详情请参阅 [LICENSE](LICENSE)。
标签:Bro, CPU架构兼容, PE文件处理, VxD驱动, Windows 9x, Windows NT, Windows系统兼容, 兼容性层, 内核模式, 内核驱动翻译, 双向兼容框架, 双向翻译, 客户端加密, 技术研究, 操作系统内核, 架构桥接, 系统工具, 系统编程, 自动回退, 虚拟化技术, 请求拦截, 身份验证强制, 逆向工具, 驱动兼容性, 驱动加载器, 驱动程序开发