Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

vdd.c

Go to the documentation of this file.
00001 /*
00002  *      This program is free software; you can redistribute it and/or
00003  *      modify it under the terms of the GNU General Public License
00004  *      as published by the Free Software Foundation; either version
00005  *      2 of the License, or (at your option) any later version.
00006  *
00007  *  Copyright 2004 Spiro Trikaliotis
00008 */
00009 
00019 // #define UNICODE 1
00020 
00021 #include <windows.h>
00022 #include <vddsvc.h>
00023 
00024 #include <opencbm.h>
00025 
00027 #define DBG_USERMODE
00028 
00030 #define DBG_DLL
00031 
00033 #define DBG_PROGNAME "OPENCBMVDD.DLL"
00034 
00036 #define DBG_IS_DEBUG_C
00037 
00038 #include "debug.h"
00039 
00040 #include "vdd.h"
00041 
00042 #include <stdlib.h>
00043 
00044 
00046 #undef EXTERN
00047 #define EXTERN __declspec(dllexport) 
00048 
00049 EXTERN BOOL VDDInitialize(IN HANDLE Module, IN DWORD Reason, IN LPVOID Reserved);
00050 EXTERN VOID VDDRegisterInit(VOID);
00051 EXTERN VOID VDDDispatch(VOID);
00052 
00053 
00055 HANDLE vdd_handle;
00056 
00064 static VOID
00065 VDDBlockHandler(VOID)
00066 {
00067     FUNC_ENTER();
00068 
00069     vdd_cbmfile_closeall();
00070 
00071     FUNC_LEAVE();
00072 }
00073 
00094 BOOL
00095 VDDInitialize(IN HANDLE Module, IN DWORD Reason, IN LPVOID Reserved)
00096 {
00097     FUNC_ENTER();
00098 
00099     DBG_PRINT((DBG_PREFIX "OpencbmVDD.Entry: " __DATE__ " " __TIME__));
00100 
00101     switch (Reason) 
00102     {
00103         case DLL_PROCESS_ATTACH:
00104             vdd_handle = Module;
00105             VDDInstallUserHook(vdd_handle, NULL, NULL, VDDBlockHandler, NULL);
00106             break;
00107 
00108         case DLL_PROCESS_DETACH:
00109             DBG_ASSERT(vdd_handle == Module);
00110             vdd_uninstall_iohook_internal();
00111             VDDDeInstallUserHook(Module);
00112 
00113             // make sure all CBM_FILE handles are closed
00114             // whenever this VDD is unloaded
00115             vdd_cbmfile_closeall();
00116             break;
00117 
00118         default:
00119             break;
00120 
00121     }
00122 
00123     FUNC_LEAVE_BOOL(TRUE);
00124 }
00125 
00132 VOID
00133 VDDRegisterInit(VOID)
00134 {
00135     FUNC_ENTER();
00136 
00137     setCF(0);
00138 
00139     FUNC_LEAVE();
00140 }
00141 
00148 VOID
00149 VDDDispatch(VOID)
00150 {
00151     FUNCTIONCODE functioncode;
00152     CBM_FILE cbmfile;
00153     BOOLEAN error;
00154 
00155     FUNC_ENTER();
00156 
00157     functioncode = getDL();
00158 
00159     error = FALSE;
00160 
00161     // convert to BX value into a CBM_FILE
00162     switch (functioncode)
00163     {
00164     case FC_VDD_USLEEP:
00165     case FC_DRIVER_OPEN:
00166     case FC_GET_DRIVER_NAME:
00167         // FC_VDD_USLEEP, FC_DRIVER_OPEN and FC_GET_DRIVER_NAME are special,
00168         // they do not have a BX input.
00169         break;
00170 
00171     default:
00172         cbmfile = vdd_cbmfile_get(getBX());
00173 
00174         if (cbmfile == INVALID_HANDLE_VALUE)
00175         {
00176             DBG_ERROR((DBG_PREFIX "invalid BX given: %04x", getBX()));
00177             error = TRUE;
00178         }
00179         break;
00180     }
00181 
00182     if (!error)
00183     {
00184         switch (functioncode)
00185         {
00186         case FC_DRIVER_OPEN:     error = vdd_driver_open();          break;
00187         case FC_DRIVER_CLOSE:    error = vdd_driver_close(cbmfile);  break;
00188         case FC_LISTEN:          error = vdd_listen(cbmfile);        break;
00189         case FC_TALK:            error = vdd_talk(cbmfile);          break;
00190         case FC_OPEN:            error = vdd_open(cbmfile);          break;
00191         case FC_CLOSE:           error = vdd_close(cbmfile);         break;
00192         case FC_RAW_READ:        error = vdd_raw_read(cbmfile);      break;
00193         case FC_RAW_WRITE:       error = vdd_raw_write(cbmfile);     break;
00194         case FC_UNLISTEN:        error = vdd_unlisten(cbmfile);      break;
00195         case FC_UNTALK:          error = vdd_untalk(cbmfile);        break;
00196         case FC_GET_EOI:         error = vdd_get_eoi(cbmfile);       break;
00197         case FC_CLEAR_EOI:       error = vdd_clear_eoi(cbmfile);     break;
00198         case FC_RESET:           error = vdd_reset(cbmfile);         break;
00199         case FC_PP_READ:         error = vdd_pp_read(cbmfile);       break;
00200         case FC_PP_WRITE:        error = vdd_pp_write(cbmfile);      break;
00201         case FC_IEC_POLL:        error = vdd_iec_poll(cbmfile);      break;
00202         case FC_IEC_GET:         error = vdd_iec_get(cbmfile);       break;
00203         case FC_IEC_SET:         error = vdd_iec_set(cbmfile);       break;
00204         case FC_IEC_RELEASE:     error = vdd_iec_release(cbmfile);   break;
00205         case FC_IEC_SETRELEASE:  error = vdd_iec_setrelease(cbmfile); break;
00206         case FC_IEC_WAIT:        error = vdd_iec_wait(cbmfile);      break;
00207         case FC_UPLOAD:          error = vdd_upload(cbmfile);        break;
00208         case FC_DEVICE_STATUS:   error = vdd_device_status(cbmfile); break; 
00209         case FC_EXEC_COMMAND:    error = vdd_exec_command(cbmfile);  break;
00210         case FC_IDENTIFY:        error = vdd_identify(cbmfile);      break;
00211         case FC_IDENTIFY_XP1541: error = vdd_identify_xp1541(cbmfile); break;
00212         case FC_GET_DRIVER_NAME: error = vdd_get_driver_name();      break;
00213 
00214         case FC_VDD_USLEEP:      error = vdd_usleep();               break;
00215 
00216         case FC_VDD_INSTALL_IOHOOK:   error = vdd_install_iohook(cbmfile);   break;
00217         case FC_VDD_UNINSTALL_IOHOOK: error = vdd_uninstall_iohook(cbmfile); break;
00218 
00219         default:
00220             // this function is not implemented:
00221             DBG_ERROR((DBG_PREFIX "unknown function code in DL: %02x", functioncode));
00222             error = TRUE;
00223             break;
00224         }
00225     }
00226 
00227     setCF(error ? 1 : 0);
00228 
00229     FUNC_LEAVE();
00230 }

Generated on Sun Apr 30 18:46:00 2006 for opencbm by  doxygen 1.4.2