adf_nativ.c
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:3k
源码类别:

Shell编程

开发平台:

Visual C++

  1. /* Win32/adf_nativ.c - Win32 specific drive-access routines for ADFLib  *  * Modified for Win32 by Dan Sutherland <dan@chromerhino.demon.co.uk>  */
  2. // Modified 29/8/00 by Gary Harris.
  3. // - Added a third, Boolean argument to Win32InitDevice() to avoid a compilation warning
  4. //   caused by the mismatch with the number of arguments in ADFLib's adfInitDevice().
  5. #include <windows.h> #include <stdlib.h> #include <string.h>
  6. #include "../adf_str.h" #include "../adf_err.h"
  7. #include "adf_nativ.h" #include "nt4_dev.h"
  8. extern struct Env adfEnv;
  9. RETCODE Win32InitDevice(struct Device* dev, char* lpstrName, BOOL ro) { struct nativeDevice* nDev;
  10. char strTempName[3];
  11. nDev = (struct nativeDevice*)dev->nativeDev; nDev = (struct nativeDevice*)malloc(sizeof(struct nativeDevice)); if (!nDev) { (*adfEnv.eFct)("Win32InitDevice : malloc"); return FALSE; }
  12. /* convert device name to something usable by Win32 functions */
  13. if (strlen(lpstrName) != 3) {
  14. (*adfEnv.eFct)("Win32InitDevice : invalid drive specifier");
  15. return FALSE;
  16. }
  17. strTempName[0] = lpstrName[1];
  18. strTempName[1] = lpstrName[2];
  19. strTempName[2] = '';
  20. nDev->hDrv = NT4OpenDrive(strTempName);
  21. if (nDev->hDrv == NULL) {
  22. (*adfEnv.eFct)("Win32InitDevice : NT4OpenDrive");
  23. return FALSE;
  24. }
  25. dev->size = NT4GetDriveSize(nDev->hDrv);
  26. dev->nativeDev = nDev;
  27. return RC_OK; } RETCODE Win32ReadSector(struct Device *dev, long n, int size, unsigned char* buf) {
  28. struct nativeDevice* tDev;
  29. tDev = (struct nativeDevice*)dev->nativeDev;
  30. if (! NT4ReadSector(tDev->hDrv, n, size, buf)) {
  31. (*adfEnv.eFct)("Win32InitDevice : NT4ReadSector");
  32. return FALSE;
  33. }
  34. return RC_OK;
  35. } RETCODE Win32WriteSector(struct Device *dev, long n, int size, unsigned char* buf) {
  36. struct nativeDevice* tDev;
  37. tDev = (struct nativeDevice*)dev->nativeDev;
  38. if (! NT4WriteSector(tDev->hDrv, n, size, buf)) {
  39. (*adfEnv.eFct)("Win32InitDevice : NT4WriteSector");
  40. return FALSE;
  41. }
  42. return RC_OK;
  43. } RETCODE Win32ReleaseDevice(struct Device *dev) { struct nativeDevice* nDev;
  44. nDev = (struct nativeDevice*)dev->nativeDev;
  45. if (! NT4CloseDrive(nDev->hDrv))
  46. return FALSE;
  47. free(nDev);
  48. return RC_OK; } void adfInitNativeFct() { struct nativeFunctions *nFct; nFct = (struct nativeFunctions*)adfEnv.nativeFct; nFct->adfInitDevice = Win32InitDevice; nFct->adfNativeReadSector = Win32ReadSector; nFct->adfNativeWriteSector = Win32WriteSector; nFct->adfReleaseDevice = Win32ReleaseDevice; nFct->adfIsDevNative = Win32IsDevNative; } BOOL Win32IsDevNative(char *devName) {
  49. return devName[0] == '|'; }