//DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) HDRVR DrvOpen(LPARAM lParam2) { NPDRVR hDriver; char unknown[0x124]; const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; #ifdef WIN32_LOADER Setup_LDT_Keeper(); #endif printf("Loading codec DLL: '%s'\n",filename); hDriver = malloc(sizeof(DRVR)); if (!hDriver) return (HDRVR) 0; memset((void*)hDriver, 0, sizeof(DRVR)); #ifdef WIN32_LOADER CodecAlloc(); Setup_FS_Segment(); #endif hDriver->hDriverModule = LoadLibraryA(filename); if (!hDriver->hDriverModule) { printf("Can't open library %s\n", filename); DrvClose((HDRVR)hDriver); return (HDRVR) 0; } hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, "DriverProc"); if (!hDriver->DriverProc) { printf("Library %s is not a valid VfW/ACM codec\n", filename); DrvClose((HDRVR)hDriver); return (HDRVR) 0; } TRACE("DriverProc == %X\n", hDriver->DriverProc); SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); TRACE("DRV_LOAD Ok!\n"); SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); TRACE("DRV_ENABLE Ok!\n"); hDriver->dwDriverID = ++dwDrvID; // generate new id // open driver and remmeber proper DriverID hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); return (HDRVR)hDriver; }
/*********************************************************************** * ICClose [MSVFW.22] */ LRESULT VFWAPI ICClose(HIC hic) { WINE_HIC *whic = (WINE_HIC*)hic; /* FIXME: correct? */ // CloseDriver(whic->hdrv,0,0); DrvClose(whic->hdrv); free(whic); return 0; }
extern void strategy(ReqPtr p) { word rc, dseg; switch (p->cmd) { case DevInit: devhlp = p->u.ini.devhlp; dseg = ctors(); if ((rc = DrvInit(p->u.ini.cmdline)) & ERROR) { p->u.ino.nunits = 0; p->u.ino.endCode = 0; p->u.ino.endData = 0; } else { p->u.ino.endCode = Offset(&end_code); p->u.ino.endData = dseg; } p->u.ino.bpb = 0; break; case DevBaseInit: devhlp = p->u.ini.devhlp; dseg = ctors(); if ((rc = DrvInitBase(p->u.ini.cmdline)) & ERROR) { p->u.ino.nunits = 0; p->u.ino.endCode = 0; p->u.ino.endData = 0; } else { p->u.ino.endCode = Offset(&end_code); p->u.ino.endData = dseg; p->u.ini.cmdline = 0; } p->u.ino.bpb = 0; break; case DevRead: PUTS(2, "DevRead file="); PUTD(2, p->u.rw.fileno); PUTS(2, ", count="); PUTD(2, p->u.rw.count); PUTC(2, '\n'); rc = DrvRead(p); break; case DevWrite: PUTS(2, "DevWrite file="); PUTD(2, p->u.rw.fileno); PUTS(2, ", count="); PUTD(2, p->u.rw.count); PUTC(2, '\n'); rc = DrvWrite(p, 0); break; case DevWriteVerify: PUTS(2, "DevWriteVerify file="); PUTD(2, p->u.rw.fileno); PUTS(2, ", count="); PUTD(2, p->u.rw.count); PUTC(2, '\n'); rc = DrvWrite(p, 1); break; case DevPeek: PUTS(2, "DevPeek\n"); rc = DrvPeek(p); break; case DevInputStatus: PUTS(2, "DevInputStatus\n"); rc = DrvInputStatus(); break; case DevInputFlush: PUTS(2, "DevInputFlush\n"); rc = DrvInputFlush(); break; case DevOutputStatus: PUTS(2, "DevOutputStatus\n"); rc = DrvOutputStatus(); break; case DevOutputFlush: PUTS(2, "DevOutputFlush\n"); rc = DrvOutputFlush(); break; case DevOpen: PUTS(2, "DevOpen file="); PUTD(2, p->u.oc.fileno); PUTC(2, '\n'); rc = DrvOpen(p); break; case DevClose: PUTS(2, "DevClose file="); PUTD(2, p->u.oc.fileno); PUTC(2, '\n'); rc = DrvClose(p); break; case DevIOCtl: PUTS(2, "DevIOCtl cat="); PUTX(2, p->u.ioc.cat); PUTS(2, ", fcn="); PUTX(2, p->u.ioc.fcn); PUTS(2, ", plen="); PUTD(2, p->u.ioc.plen); PUTS(2, ", dlen="); PUTD(2, p->u.ioc.dlen); PUTC(2, '\n'); rc = DrvIOCtl(p); break; default: rc = ERROR + DONE + InvalidCommand; } PUTS(2, "Status="); PUTX(2, rc); PUTC(2, '\n'); p->status = rc; }