00001
00002
00003
00004
00005
00006
00007
00008
00009
00019
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
00114
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
00162 switch (functioncode)
00163 {
00164 case FC_VDD_USLEEP:
00165 case FC_DRIVER_OPEN:
00166 case FC_GET_DRIVER_NAME:
00167
00168
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
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 }