| 56 | | #elif defined (DOS32) // DOS specific local stuff |
| 57 | | |
| 58 | | #define DRIVETYPE_REMOTE 0x1000 // BIT 12 from Ioctl 4409 dx |
| 59 | | #define DRIVETYPE_RAMDRV 0x0800 // BIT 11 from Ioctl 4409 dx |
| | 62 | #else |
| | 63 | |
| | 64 | #define TXFSDC_BLOCKR 0x00 // block device removable |
| | 65 | #define TXFSDC_GETBPB 0x00 // get device bpb info |
| | 66 | |
| | 67 | #define TXFSDC_UNLOCK 0x00 // unlock logical drive |
| | 68 | #define TXFSDC_LOCK 0x01 // lock logical drive |
| | 69 | #define TXFSDC_EJECT 0x02 // eject removable |
| | 70 | #define TXFSDC_LOAD 0x03 // load removable |
| | 71 | |
| | 72 | typedef struct drivecmd |
| | 73 | { |
| | 74 | BYTE cmd; // 0=unlock 1=lock 2=eject |
| | 75 | BYTE drv; // 0=A, 1=B 2=C ... |
| | 76 | } DRIVECMD; // end of struct "drivecmd" |
| | 77 | |
| | 78 | #define TXFSBPB_REMOVABLE 0x08 // BPB attribute for removable |
| | 79 | |
| | 80 | typedef struct drivebpb |
| | 81 | { |
| | 82 | TXFS_EBPB ebpb; // extended BPB |
| | 83 | BYTE reserved[6]; |
| | 84 | USHORT cyls; |
| | 85 | BYTE type; |
| | 86 | USHORT attributes; // device attributes |
| | 87 | BYTE fill[6]; // documented for IOCtl |
| | 88 | } DRIVEBPB; // end of struct "drivebpb" |
| | 836 | // Eject a removable medium specified by driveletter |
| | 837 | /*****************************************************************************/ |
| | 838 | ULONG TxFsEjectRemovable |
| | 839 | ( |
| | 840 | char *drive // IN Driveletter to eject |
| | 841 | ) |
| | 842 | { |
| | 843 | ULONG rc = NO_ERROR; // DOS rc |
| | 844 | #if defined (WIN32) |
| | 845 | #elif defined (DOS32) |
| | 846 | #elif defined (LINUX) |
| | 847 | #else |
| | 848 | DRIVECMD IOCtl; |
| | 849 | ULONG DataLen; |
| | 850 | ULONG ParmLen; |
| | 851 | #endif |
| | 852 | |
| | 853 | ENTER(); |
| | 854 | TxFsAutoFailCriticalErrors( TRUE); // avoid Not-ready pop-ups |
| | 855 | |
| | 856 | TRACES(("Drive: %s\n", drive)); |
| | 857 | #if defined (WIN32) |
| | 858 | #elif defined (DOS32) |
| | 859 | #elif defined (LINUX) |
| | 860 | #else |
| | 861 | ParmLen = sizeof(DRIVECMD); |
| | 862 | IOCtl.cmd = TXFSDC_EJECT; |
| | 863 | IOCtl.drv = toupper(drive[0]) - 'A'; |
| | 864 | DataLen = 0; |
| | 865 | |
| | 866 | rc = DosDevIOCtl((HFILE) -1, IOCTL_DISK, |
| | 867 | DSK_UNLOCKEJECTMEDIA, |
| | 868 | &IOCtl, ParmLen, &ParmLen, |
| | 869 | NULL, DataLen, &DataLen); |
| | 870 | #endif |
| | 871 | TxFsAutoFailCriticalErrors( FALSE); // enable criterror handler |
| | 872 | RETURN (rc); |
| | 873 | } // end 'TxFsEjectRemovable' |
| | 874 | /*---------------------------------------------------------------------------*/ |
| | 875 | |
| | 876 | |
| | 877 | /*****************************************************************************/ |
| | 878 | // Determine if a driveletter represents a removable medium/device |
| | 879 | /*****************************************************************************/ |
| | 880 | BOOL TxFsIsRemovable // RET drive is removable |
| | 881 | ( |
| | 882 | char *drive // IN Driveletter to test |
| | 883 | ) |
| | 884 | { |
| | 885 | BOOL rc = FALSE; |
| | 886 | #if defined (WIN32) |
| | 887 | #elif defined (DOS32) |
| | 888 | #elif defined (LINUX) |
| | 889 | #else |
| | 890 | DRIVECMD IOCtl; |
| | 891 | DRIVEBPB RemAt; |
| | 892 | ULONG DataLen; |
| | 893 | ULONG ParmLen; |
| | 894 | BYTE NoRem; |
| | 895 | #endif |
| | 896 | |
| | 897 | ENTER(); |
| | 898 | TxFsAutoFailCriticalErrors( TRUE); // avoid Not-ready pop-ups |
| | 899 | |
| | 900 | TRACES(("Drive: %s\n", drive)); |
| | 901 | #if defined (WIN32) |
| | 902 | #elif defined (DOS32) |
| | 903 | #elif defined (LINUX) |
| | 904 | #else |
| | 905 | ParmLen = sizeof(IOCtl); |
| | 906 | IOCtl.cmd = TXFSDC_BLOCKR; |
| | 907 | IOCtl.drv = toupper(drive[0]) - 'A'; |
| | 908 | DataLen = sizeof(NoRem); |
| | 909 | |
| | 910 | if (DosDevIOCtl((HFILE) -1, IOCTL_DISK, |
| | 911 | DSK_BLOCKREMOVABLE, |
| | 912 | &IOCtl, ParmLen, &ParmLen, |
| | 913 | &NoRem, DataLen, &DataLen) == NO_ERROR) |
| | 914 | { |
| | 915 | if (NoRem) // non-removable sofar, check |
| | 916 | { // BPB as well (USB devices) |
| | 917 | ParmLen = sizeof(IOCtl); |
| | 918 | IOCtl.cmd = TXFSDC_GETBPB; |
| | 919 | IOCtl.drv = toupper(drive[0]) - 'A'; |
| | 920 | DataLen = sizeof(RemAt); |
| | 921 | |
| | 922 | if (DosDevIOCtl((HFILE) -1, IOCTL_DISK, |
| | 923 | DSK_GETDEVICEPARAMS, |
| | 924 | &IOCtl, ParmLen, &ParmLen, |
| | 925 | &RemAt, DataLen, &DataLen) == NO_ERROR) |
| | 926 | |
| | 927 | { |
| | 928 | if (RemAt.attributes & TXFSBPB_REMOVABLE) |
| | 929 | { |
| | 930 | TRACES(( "BPB removable, like USB\n")); |
| | 931 | rc = TRUE; // removable, probably USB |
| | 932 | } |
| | 933 | } |
| | 934 | } |
| | 935 | else |
| | 936 | { |
| | 937 | TRACES(( "Block removable\n")); |
| | 938 | rc = TRUE; // removable block device |
| | 939 | } |
| | 940 | } |
| | 941 | #endif |
| | 942 | TxFsAutoFailCriticalErrors( FALSE); // enable criterror handler |
| | 943 | BRETURN (rc); |
| | 944 | } // end 'TxFsIsRemovable' |
| | 945 | /*---------------------------------------------------------------------------*/ |
| | 946 | |
| | 947 | |
| | 948 | /*****************************************************************************/ |