This commit is contained in:
Mario Fetka
2026-05-23 21:58:13 +02:00
parent e4a5251a0b
commit af8a046f9d
3 changed files with 105 additions and 2368 deletions

13
kern.h
View File

@@ -20,11 +20,6 @@ extern int KERN_CALL C32_GetFunc_Probe(char *name, void *outbuf);
extern int KERN_CALL C32_CallVersion_Nios_Probe(void *outbuf);
extern int KERN_CALL C32_MapLock_Probe(void *ptr, UI len, void *outbuf);
extern int KERN_CALL C32_MapVar_Probe(UI specLen, UI flag, void *outbuf);
extern int KERN_CALL C32_MapFull2_Probe(void *outbuf);
extern int KERN_CALL C32_MapFull_Probe(void *outbuf);
extern int KERN_CALL C32_ScanRefsIter_Probe(UI iterLo, UI iterHi, void *outbuf);
extern int KERN_CALL C32_ScanRefs2_Probe(void *outbuf);
extern int KERN_CALL C32_ScanFirst_Probe(void *outbuf);
extern int KERN_CALL C32_OpenRef_Probe(UI refLo, UI refHi, void *outbuf);
extern int KERN_CALL C32_NCP87_Raw5_Probe(UI connLo, UI connHi,
void *hdr, UI hdrLen,
@@ -32,17 +27,9 @@ extern int KERN_CALL C32_NCP87_Raw5_Probe(UI connLo, UI connHi,
void *rep0, UI rep0Len,
void *rep1, UI rep1Len,
void *outbuf);
extern int KERN_CALL C32_NCP87_Raw_Probe(UI connLo, UI connHi,
void *hdr, UI hdrLen,
void *path, UI pathLen,
void *rep0, UI rep0Len,
void *rep1, UI rep1Len,
void *outbuf);
extern int KERN_CALL Net_Call_VLM_Raw(UI ax, UI bx, UI cx, UI dx,
void *req, void *repl,
UI p1, UI p2, UI p3);
extern int KERN_CALL Net_Call_NWCVLMREQ(UI flags, void *regblk,
UI p1, UI p2, UI p3);
extern int KERN_CALL Net_Call_C(UI func, void *req, void *repl);
extern int KERN_CALL Net_Call_CX(UI func, UI bx, UI cx, UI dx,
void *req, void *repl);

File diff suppressed because it is too large Load Diff

752
nwtests.c
View File

@@ -1300,111 +1300,6 @@ static int tests_c32mapflat(void)
}
static int tests_nwreq87c32raw_one(UI connLo, UI connHi, UI label)
{
uint8 connid = 0;
uint8 dhandle = 0;
uint8 flags = 0;
int drive;
uint8 hdr[16];
uint8 path[0x140];
uint8 rep0[0x60];
uint8 rep1[0x110];
uint8 out[32];
UI path_len;
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg, fn_off, fn_seg;
uint16 ret_ax, ret_dx, act_lo, act_hi;
drive = tests_get_current_drive();
get_drive_info((uint8)drive, &connid, &dhandle, &flags);
memset(hdr, 0, sizeof(hdr));
hdr[0] = 6;
hdr[1] = 0;
hdr[2] = 0;
tests_put_word_lh(hdr + 3, 0x0006);
tests_put_dword_lh(hdr + 5, 0x00000004UL);
path_len = tests_build_novell_handle_path(path, dhandle, 0, 0, 1,
"LOGIN.EXE", 0, 0);
memset(rep0, 0, sizeof(rep0));
memset(rep1, 0, sizeof(rep1));
memset(out, 0, sizeof(out));
fprintf(stdout, "\nTEST NWREQ87C32RAW label=%u conn32=%04X:%04X\n",
label, connHi, connLo);
fprintf(stdout, "drive=%c: connid=%u dhandle=%u flags=%02X path_len=%u\n",
'A' + drive, connid, dhandle, flags, path_len);
tests_dump_bytes("HDR :", hdr, 9);
tests_dump_bytes("PATH:", path, path_len > 48 ? 48 : path_len);
C32_NCP87_Raw_Probe(connLo, connHi,
hdr, 9,
path, path_len,
rep0, 0x4d,
rep1, 0x100,
out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
act_lo = tests_get_word_lh(out + 18);
act_hi = tests_get_word_lh(out + 20);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function COMPAT=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X actual=%04X:%04X\n",
ret_dx, ret_ax, act_hi, act_lo);
tests_dump_bytes("OUT :", out, 22);
tests_dump_bytes("REP0:", rep0, 64);
tests_dump_bytes("REP1:", rep1, 64);
return(0);
}
static int tests_nwreq87c32raw(int argc, char *argv[])
{
UI lo = 0;
UI hi = 0;
if (argc > 2)
lo = (UI)atoi(argv[2]);
if (argc > 3)
hi = (UI)atoi(argv[3]);
return tests_nwreq87c32raw_one(lo, hi, 0);
}
static int tests_nwreq87c32matrix(void)
{
UI vals[6];
int i;
vals[0] = 0;
vals[1] = 1;
vals[2] = 2;
vals[3] = 3;
vals[4] = 0x31;
vals[5] = 0x3130;
fprintf(stdout, "TEST NWREQ87C32MATRIX paged\n");
tests_wait_key();
for (i = 0; i < 6; i++) {
tests_nwreq87c32raw_one(vals[i], 0, (UI)i);
if (i != 5)
tests_wait_key();
}
return(0);
}
@@ -1432,504 +1327,16 @@ static void tests_dump_vlm_regs(char *title, uint8 *r)
tests_get_reg_word(r, 14));
}
static int tests_c32primref(void)
{
uint8 regs[16];
int rc;
UI primref;
memset(regs, 0, sizeof(regs));
/*
* DeveloperNet dgtprmci.o / NWCGETPRIMCONNREF:
*
* regblk.AX = 1
* NWCVLMREQ(flags=0, regblk, p1=4, p2=43h, p3=0)
* if rc==0:
* primaryConnRef = regblk.CX
*/
tests_set_reg_word(regs, 8, 1); /* AX */
fprintf(stdout, "TEST C32PRIMREF / NWCGETPRIMCONNREF VLM step\n");
tests_dump_vlm_regs("REG in :", regs);
fprintf(stdout, "Call NWCVLMREQ flags=0 p1=0004 p2=0043 p3=0000\n");
rc = Net_Call_NWCVLMREQ(0, regs, 0x0004, 0x0043, 0);
fprintf(stdout, "NWCVLMREQ rc=%04X\n", rc);
tests_dump_vlm_regs("REG out:", regs);
primref = tests_get_reg_word(regs, 12); /* CX */
fprintf(stdout, "primary connection reference candidate CX=%04X decimal=%u\n",
primref, primref);
if (rc == 0 && primref != 0) {
fprintf(stdout, "\nNext test:\n");
fprintf(stdout, " TESTS NWREQ87C32RAW %u 0\n", primref);
}
return(0);
}
static int tests_c32openref(int argc, char *argv[])
{
UI refLo = 40;
UI refHi = 0;
uint8 out[32];
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx, h_lo, h_hi;
if (argc > 2)
refLo = (UI)atoi(argv[2]);
if (argc > 3)
refHi = (UI)atoi(argv[3]);
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32OPENREF ref=%04X:%04X\n", refHi, refLo);
fprintf(stdout, "Open Client32 connection by reference via CONNOpenByReference\n");
C32_OpenRef_Probe(refLo, refHi, out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
h_lo = tests_get_word_lh(out + 18);
h_hi = tests_get_word_lh(out + 20);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNOpenByReference=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X handle=%04X:%04X\n",
ret_dx, ret_ax, h_hi, h_lo);
tests_dump_bytes("OUT:", out, 22);
if (ret_ax == 0 && ret_dx == 0)
fprintf(stdout, "\nNext test:\n TESTS NWREQ87C32RAW %u %u\n", h_lo, h_hi);
return(0);
}
static int tests_c32mapconn_value(UI conn16, UI label)
{
uint8 regs[16];
uint8 reply[128];
int rc;
memset(regs, 0, sizeof(regs));
memset(reply, 0, sizeof(reply));
/*
* Exact first half of __C32MapConn16To32:
* reg.CX = conn16
* reg.ES:DI = reply buffer
* NWCVLMREQ(flags=2, regblk, p1=0Dh, p2=10h, p3=0)
*/
tests_set_reg_word(regs, 4, FP_OFF(reply)); /* DI */
tests_set_reg_word(regs, 6, FP_SEG(reply)); /* ES */
tests_set_reg_word(regs, 12, conn16); /* CX */
fprintf(stdout, "\nC32MAPCONN value=%u label=%u\n", conn16, label);
tests_dump_vlm_regs("REG in :", regs);
fprintf(stdout, "Call NWCVLMREQ flags=2 p1=000D p2=0010 p3=0000\n");
rc = Net_Call_NWCVLMREQ(2, regs, 0x000D, 0x0010, 0);
fprintf(stdout, "NWCVLMREQ rc=%04X\n", rc);
tests_dump_vlm_regs("REG out:", regs);
tests_dump_bytes("REPLY:", reply, 64);
fprintf(stdout, "REPLY text: %s\n", reply);
return rc;
}
static int tests_c32mapconnone(int argc, char *argv[])
{
UI val;
if (argc < 3) {
fprintf(stdout, "Usage: TESTS C32MAPCONNONE value\n");
return(1);
}
val = (UI)atoi(argv[2]);
return tests_c32mapconn_value(val, val);
}
static int tests_c32scanfirst(void)
{
uint8 out[32];
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx, ref_lo, ref_hi;
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32SCANFIRST\n");
fprintf(stdout, "Minimal CONNScanInfo enumerate probe, no scan criterion\n");
C32_ScanFirst_Probe(out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
ref_lo = tests_get_word_lh(out + 18);
ref_hi = tests_get_word_lh(out + 20);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNScanInfo=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X scan/result=%04X:%04X\n",
ret_dx, ret_ax, ref_hi, ref_lo);
tests_dump_bytes("OUT:", out, 22);
if (ret_ax == 0 && ret_dx == 0 && (ref_lo || ref_hi)) {
fprintf(stdout, "\nTry next:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", ref_lo, ref_hi);
}
return(0);
}
static int tests_c32scanrefs2(void)
{
uint8 out[40];
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx;
uint16 cref_lo, cref_hi, rinfo_lo, rinfo_hi, iter_lo, iter_hi;
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32SCANREFS2\n");
fprintf(stdout, "CONNScanInfo exact-shape probe, return NWCC_INFO_CONN_REF\n");
C32_ScanRefs2_Probe(out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
cref_lo = tests_get_word_lh(out + 18);
cref_hi = tests_get_word_lh(out + 20);
rinfo_lo = tests_get_word_lh(out + 22);
rinfo_hi = tests_get_word_lh(out + 24);
iter_lo = tests_get_word_lh(out + 26);
iter_hi = tests_get_word_lh(out + 28);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNScanInfo=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X\n", ret_dx, ret_ax);
fprintf(stdout, "connRef=%04X:%04X returnInfo=%04X:%04X iterator=%04X:%04X\n",
cref_hi, cref_lo, rinfo_hi, rinfo_lo, iter_hi, iter_lo);
tests_dump_bytes("OUT:", out, 30);
if (ret_ax == 0 && ret_dx == 0 && (cref_lo || cref_hi)) {
fprintf(stdout, "\nTry next:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", cref_lo, cref_hi);
}
return(0);
}
static int tests_c32scaniter(int argc, char *argv[])
{
uint8 out[40];
UI iterLo = 0;
UI iterHi = 0;
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx;
uint16 cref_lo, cref_hi, rinfo_lo, rinfo_hi, out_iter_lo, out_iter_hi;
if (argc > 2)
iterLo = (UI)atoi(argv[2]);
if (argc > 3)
iterHi = (UI)atoi(argv[3]);
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32SCANITER initial iterator=%04X:%04X\n", iterHi, iterLo);
fprintf(stdout, "CONNScanInfo return NWCC_INFO_CONN_REF with caller-supplied iterator\n");
C32_ScanRefsIter_Probe(iterLo, iterHi, out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
cref_lo = tests_get_word_lh(out + 18);
cref_hi = tests_get_word_lh(out + 20);
rinfo_lo = tests_get_word_lh(out + 22);
rinfo_hi = tests_get_word_lh(out + 24);
out_iter_lo = tests_get_word_lh(out + 26);
out_iter_hi = tests_get_word_lh(out + 28);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNScanInfo=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X\n", ret_dx, ret_ax);
fprintf(stdout, "connRef=%04X:%04X returnInfo=%04X:%04X iterator=%04X:%04X\n",
cref_hi, cref_lo, rinfo_hi, rinfo_lo, out_iter_hi, out_iter_lo);
tests_dump_bytes("OUT:", out, 30);
if (ret_ax == 0 && ret_dx == 0) {
fprintf(stdout, "\nNext iterator test:\n");
fprintf(stdout, " TESTS C32SCANITER %u %u\n", out_iter_lo, out_iter_hi);
if ((cref_lo || cref_hi) && !(cref_lo == 0xFFFE && cref_hi == 0xFFFF)) {
fprintf(stdout, "Try open:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", cref_lo, cref_hi);
}
}
return(0);
}
static int tests_c32mapfull(void)
{
uint8 out[32];
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx;
uint16 result_lo, result_hi, cref_lo, cref_hi;
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32MAPFULL\n");
fprintf(stdout, "Exact-ish w95mconn __C32MapConn16To32 scan step for server MARS\n");
C32_MapFull_Probe(out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
result_lo = tests_get_word_lh(out + 18);
result_hi = tests_get_word_lh(out + 20);
cref_lo = tests_get_word_lh(out + 22);
cref_hi = tests_get_word_lh(out + 24);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNScanInfo=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X\n", ret_dx, ret_ax);
fprintf(stdout, "resultRef=%04X:%04X connRefLocal=%04X:%04X\n",
result_hi, result_lo, cref_hi, cref_lo);
tests_dump_bytes("OUT:", out, 26);
if (ret_ax == 0 && ret_dx == 0 && (result_lo || result_hi)) {
fprintf(stdout, "\nTry next:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", result_lo, result_hi);
fprintf(stdout, " TESTS NWREQ87C32RAW %u %u\n", result_lo, result_hi);
}
return(0);
}
static int tests_c32mapfull2(void)
{
uint8 out[32];
uint16 load_ax, res_off, res_seg, tramp_off, tramp_seg;
uint16 fn_off, fn_seg, ret_ax, ret_dx;
uint16 result_lo, result_hi, cref_lo, cref_hi;
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST C32MAPFULL2\n");
fprintf(stdout, "w95mconn scan step with exact L115 flag pair 0000:0001\n");
C32_MapFull2_Probe(out);
load_ax = tests_get_word_lh(out + 0);
res_off = tests_get_word_lh(out + 2);
res_seg = tests_get_word_lh(out + 4);
tramp_off = tests_get_word_lh(out + 6);
tramp_seg = tests_get_word_lh(out + 8);
fn_off = tests_get_word_lh(out + 10);
fn_seg = tests_get_word_lh(out + 12);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
result_lo = tests_get_word_lh(out + 18);
result_hi = tests_get_word_lh(out + 20);
cref_lo = tests_get_word_lh(out + 22);
cref_hi = tests_get_word_lh(out + 24);
fprintf(stdout, "Load AX=%04X Resolver=%04X:%04X Tramp=%04X:%04X\n",
load_ax, res_seg, res_off, tramp_seg, tramp_off);
fprintf(stdout, "Function CONNScanInfo=%04X:%04X\n", fn_seg, fn_off);
fprintf(stdout, "Return DX:AX=%04X:%04X\n", ret_dx, ret_ax);
fprintf(stdout, "resultRef=%04X:%04X connRefLocal=%04X:%04X\n",
result_hi, result_lo, cref_hi, cref_lo);
tests_dump_bytes("OUT:", out, 26);
if (ret_ax == 0 && ret_dx == 0 && (result_lo || result_hi)) {
fprintf(stdout, "\nTry next:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", result_lo, result_hi);
fprintf(stdout, " TESTS NWREQ87C32RAW %u %u\n", result_lo, result_hi);
}
return(0);
}
static int tests_c32mapvar_one(UI specLen, UI flag)
{
uint8 out[32];
uint16 ret_ax, ret_dx, result_lo, result_hi, cref_lo, cref_hi;
memset(out, 0, sizeof(out));
fprintf(stdout, "\nTEST C32MAPVAR specLen=%u flag=%u\n", specLen, flag);
C32_MapVar_Probe(specLen, flag, out);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
result_lo = tests_get_word_lh(out + 18);
result_hi = tests_get_word_lh(out + 20);
cref_lo = tests_get_word_lh(out + 22);
cref_hi = tests_get_word_lh(out + 24);
fprintf(stdout, "Return DX:AX=%04X:%04X resultRef=%04X:%04X connRefLocal=%04X:%04X\n",
ret_dx, ret_ax, result_hi, result_lo, cref_hi, cref_lo);
tests_dump_bytes("OUT:", out, 26);
if (ret_ax == 0 && ret_dx == 0 && (cref_lo || cref_hi) &&
!(cref_lo == 0xFFFE && cref_hi == 0xFFFF)) {
fprintf(stdout, "Try open with connRefLocal:\n");
fprintf(stdout, " TESTS C32OPENREF %u %u\n", cref_lo, cref_hi);
}
return(0);
}
static int tests_c32mapvar(int argc, char *argv[])
{
UI specLen = 5;
UI flag = 0;
if (argc > 2)
specLen = (UI)atoi(argv[2]);
if (argc > 3)
flag = (UI)atoi(argv[3]);
return tests_c32mapvar_one(specLen, flag);
}
static int tests_c32mapvarmatrix(void)
{
fprintf(stdout, "TEST C32MAPVARMATRIX paged\n");
fprintf(stdout, "Trying SPECTDATA length/flag variants for server MARS.\n");
tests_wait_key();
tests_c32mapvar_one(5, 0);
tests_wait_key();
tests_c32mapvar_one(5, 1);
tests_wait_key();
tests_c32mapvar_one(0x31, 0);
tests_wait_key();
tests_c32mapvar_one(0x31, 1);
return(0);
}
static int tests_nwreq87c32raw5(int argc, char *argv[])
{
UI lo = 0;
UI hi = 0;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 flags = 0;
int drive;
uint8 hdr[16];
uint8 path[0x140];
uint8 rep0[0x60];
uint8 rep1[0x110];
uint8 out[32];
UI path_len;
uint16 ret_ax, ret_dx, act_lo, act_hi;
if (argc > 2)
lo = (UI)atoi(argv[2]);
if (argc > 3)
hi = (UI)atoi(argv[3]);
drive = tests_get_current_drive();
get_drive_info((uint8)drive, &connid, &dhandle, &flags);
memset(hdr, 0, sizeof(hdr));
hdr[0] = 6;
hdr[1] = 0;
hdr[2] = 0;
tests_put_word_lh(hdr + 3, 0x0006);
tests_put_dword_lh(hdr + 5, 0x00000004UL);
path_len = tests_build_novell_handle_path(path, dhandle, 0, 0, 1,
"LOGIN.EXE", 0, 0);
memset(rep0, 0, sizeof(rep0));
memset(rep1, 0, sizeof(rep1));
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST NWREQ87C32RAW5 conn32=%04X:%04X\n", hi, lo);
fprintf(stdout, "d32wrap-compatible 5-slot/0x28 frag tables\n");
fprintf(stdout, "drive=%c: connid=%u dhandle=%u flags=%02X path_len=%u\n",
'A' + drive, connid, dhandle, flags, path_len);
C32_NCP87_Raw5_Probe(lo, hi,
hdr, 9,
path, path_len,
rep0, 0x4d,
rep1, 0x100,
out);
ret_ax = tests_get_word_lh(out + 14);
ret_dx = tests_get_word_lh(out + 16);
act_lo = tests_get_word_lh(out + 18);
act_hi = tests_get_word_lh(out + 20);
fprintf(stdout, "Return DX:AX=%04X:%04X actual=%04X:%04X\n",
ret_dx, ret_ax, act_hi, act_lo);
tests_dump_bytes("OUT :", out, 22);
tests_dump_bytes("REP0:", rep0, 64);
tests_dump_bytes("REP1:", rep1, 64);
return(0);
}
static unsigned long tests_get_dword_be_local(uint8 *p)
@@ -2064,42 +1471,31 @@ static int tests_ncp87c32auto(void)
}
static int tests_ncp87c32attr(void)
{
uint8 connid = 0;
uint8 dhandle = 0;
uint8 flags = 0;
int drive;
/*
* Reusable Client32 helpers for FLAG and future DOS tools.
*
* These are intentionally not test/probe commands. They wrap the verified
* Client32 sequence:
*
* C32_MapVar_Probe(4,0) -> connRefLocal FFFF:FFFE
* C32_OpenRef_Probe(connRefLocal) -> Client32 handle, e.g. 0101:0001
* C32_NCP87_Raw5_Probe(handle) -> NCP87/S6
*/
static int c32_get_ncp_handle(uint16 *handle_lo, uint16 *handle_hi)
{
uint8 mapout[32];
uint8 openout[32];
uint8 rawout[32];
uint16 map_ret_ax, map_ret_dx;
uint16 cref_lo, cref_hi;
uint16 open_ret_ax, open_ret_dx;
uint16 handle_lo, handle_hi;
uint16 raw_ret_ax, raw_ret_dx;
uint16 actual_lo, actual_hi;
uint8 hdr[16];
uint8 path[0x140];
uint8 rep0[0x60];
uint8 rep1[0x110];
UI path_len;
unsigned long attr;
if (!handle_lo || !handle_hi)
return(1);
drive = tests_get_current_drive();
get_drive_info((uint8)drive, &connid, &dhandle, &flags);
*handle_lo = 0;
*handle_hi = 0;
/*
* Client32 path confirmed:
* C32_MapVar_Probe(4,0) -> connRefLocal FFFF:FFFE
* C32_OpenRef_Probe(connRefLocal) -> handle 0101:0001
* C32_NCP87_Raw5_Probe(handle) -> NCP87/S6 works
*
* No VLM mapper/debug calls are used here.
*/
memset(mapout, 0, sizeof(mapout));
C32_MapVar_Probe(4, 0, mapout);
@@ -2108,34 +1504,65 @@ static int tests_ncp87c32attr(void)
cref_lo = tests_get_word_lh(mapout + 22);
cref_hi = tests_get_word_lh(mapout + 24);
if (map_ret_ax != 0 || map_ret_dx != 0 || (cref_lo == 0 && cref_hi == 0)) {
fprintf(stdout, "C32 attr: map failed rc=%04X:%04X\n", map_ret_dx, map_ret_ax);
return(1);
}
if (map_ret_ax != 0 || map_ret_dx != 0 || (cref_lo == 0 && cref_hi == 0))
return(2);
memset(openout, 0, sizeof(openout));
C32_OpenRef_Probe(cref_lo, cref_hi, openout);
open_ret_ax = tests_get_word_lh(openout + 14);
open_ret_dx = tests_get_word_lh(openout + 16);
handle_lo = tests_get_word_lh(openout + 18);
handle_hi = tests_get_word_lh(openout + 20);
*handle_lo = tests_get_word_lh(openout + 18);
*handle_hi = tests_get_word_lh(openout + 20);
if (open_ret_ax != 0 || open_ret_dx != 0 || (handle_lo == 0 && handle_hi == 0)) {
fprintf(stdout, "C32 attr: openref failed rc=%04X:%04X ref=%04X:%04X\n",
open_ret_dx, open_ret_ax, cref_hi, cref_lo);
if (open_ret_ax != 0 || open_ret_dx != 0 || (*handle_lo == 0 && *handle_hi == 0))
return(3);
return(0);
}
static int c32_ncp87_obtain_rim_attributes(const char *name,
uint16 dir_handle,
unsigned long *attr_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out)
{
uint16 handle_lo, handle_hi;
uint8 hdr[16];
uint8 path[0x140];
uint8 rep0[0x60];
uint8 rep1[0x110];
uint8 rawout[32];
UI path_len;
uint16 raw_ret_ax, raw_ret_dx;
uint16 actual_lo;
int rc;
if (!name || !attr_out)
return(1);
}
*attr_out = 0;
if (actual_out)
*actual_out = 0;
if (handle_lo_out)
*handle_lo_out = 0;
if (handle_hi_out)
*handle_hi_out = 0;
rc = c32_get_ncp_handle(&handle_lo, &handle_hi);
if (rc)
return(10 + rc);
memset(hdr, 0, sizeof(hdr));
hdr[0] = 6;
hdr[1] = 0;
hdr[2] = 0;
tests_put_word_lh(hdr + 3, 0x0006); /* subfunction 6 */
tests_put_word_lh(hdr + 3, 0x0006); /* NCP87 subfunction 6 */
tests_put_dword_lh(hdr + 5, 0x00000004UL); /* RIM_ATTRIBUTES */
path_len = tests_build_novell_handle_path(path, dhandle, 0, 0, 1,
"LOGIN.EXE", 0, 0);
path_len = tests_build_novell_handle_path(path, dir_handle, 0, 0, 1,
(char *)name, 0, 0);
memset(rep0, 0, sizeof(rep0));
memset(rep1, 0, sizeof(rep1));
@@ -2151,23 +1578,58 @@ static int tests_ncp87c32attr(void)
raw_ret_ax = tests_get_word_lh(rawout + 14);
raw_ret_dx = tests_get_word_lh(rawout + 16);
actual_lo = tests_get_word_lh(rawout + 18);
actual_hi = tests_get_word_lh(rawout + 20);
if (raw_ret_ax != 0 || raw_ret_dx != 0) {
fprintf(stdout, "C32 attr: ncp87 failed rc=%04X:%04X actual=%04X:%04X\n",
raw_ret_dx, raw_ret_ax, actual_hi, actual_lo);
return(1);
}
if (raw_ret_ax != 0 || raw_ret_dx != 0)
return(20);
/* In the verified reply, RIM_ATTRIBUTES is the little-endian dword at REP0+4. */
attr = tests_get_dword_le_local(rep0 + 4);
/*
* Verified reply layout for RIM_ATTRIBUTES:
* REP0+4 little-endian dword = DOS attributes
* Example LOGIN.EXE: 20h archive.
*/
*attr_out = tests_get_dword_le_local(rep0 + 4);
fprintf(stdout, "NCP87C32ATTR LOGIN.EXE attr=%02lX handle=%04X:%04X actual=%04X\n",
attr & 0xffUL, handle_hi, handle_lo, actual_lo);
if (actual_out)
*actual_out = actual_lo;
if (handle_lo_out)
*handle_lo_out = handle_lo;
if (handle_hi_out)
*handle_hi_out = handle_hi;
return(0);
}
static int tests_ncp87c32attr(void)
{
uint8 connid = 0;
uint8 dhandle = 0;
uint8 flags = 0;
int drive;
unsigned long attr;
uint16 actual;
uint16 handle_lo;
uint16 handle_hi;
int rc;
drive = tests_get_current_drive();
get_drive_info((uint8)drive, &connid, &dhandle, &flags);
rc = c32_ncp87_obtain_rim_attributes("LOGIN.EXE",
(uint16)dhandle,
&attr,
&actual,
&handle_lo,
&handle_hi);
if (rc) {
fprintf(stdout, "NCP87C32ATTR failed rc=%d\n", rc);
return(rc);
}
fprintf(stdout, "NCP87C32ATTR LOGIN.EXE attr=%02lX handle=%04X:%04X actual=%04X\n",
attr & 0xffUL, handle_hi, handle_lo, actual);
return(0);
}
int func_tests(int argc, char *argv[], int mode)
{
@@ -2195,10 +1657,6 @@ int func_tests(int argc, char *argv[], int mode)
if (tests_same_arg(argv[1], "NCP87C32AUTO"))
return tests_ncp87c32auto();
if (tests_same_arg(argv[1], "NWREQ87C32RAW5"))
return tests_nwreq87c32raw5(argc, argv);
if (tests_same_arg(argv[1], "NWREQ87C32MATRIX"))
return tests_nwreq87c32matrix();