Changeset 8259 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Apr 13, 2002, 8:31:53 AM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r7927 r8259 1 /* $Id: oslibdos.cpp,v 1.9 6 2002-02-15 19:14:52 sandervlExp $ */1 /* $Id: oslibdos.cpp,v 1.97 2002-04-13 06:31:53 bird Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 170 170 case ERROR_INVALID_ACCESS: //12 171 171 return ERROR_INVALID_ACCESS_W; 172 172 173 173 case ERROR_INVALID_DATA: //13 174 174 return ERROR_INVALID_DATA_W; 175 175 176 176 case ERROR_INVALID_DRIVE: //15 177 177 return ERROR_INVALID_DRIVE_W; 178 178 179 179 case ERROR_CURRENT_DIRECTORY: // 16 180 180 return ERROR_CURRENT_DIRECTORY_W; 181 181 182 182 case ERROR_NO_MORE_FILES: //18 183 183 return ERROR_NO_MORE_FILES_W; … … 185 185 case ERROR_WRITE_PROTECT: //19 186 186 return ERROR_WRITE_PROTECT_W; 187 187 188 188 case ERROR_BAD_UNIT: //20 189 189 return ERROR_BAD_UNIT_W; … … 191 191 case ERROR_NOT_READY: //21 192 192 return ERROR_NOT_READY_W; 193 193 194 194 case ERROR_CRC: //23 195 195 return ERROR_CRC_W; 196 196 197 197 case ERROR_NOT_DOS_DISK: //26 198 198 return ERROR_NOT_DOS_DISK_W; … … 209 209 case ERROR_LOCK_VIOLATION: //32 210 210 return ERROR_LOCK_VIOLATION_W; 211 211 212 212 case ERROR_WRONG_DISK: //34 213 213 return ERROR_WRONG_DISK_W; 214 214 215 215 case ERROR_SHARING_BUFFER_EXCEEDED: //36 216 216 return ERROR_SHARING_BUFFER_EXCEEDED_W; … … 233 233 case ERROR_TOO_MANY_SEMAPHORES: //100 234 234 return ERROR_TOO_MANY_SEMAPHORES_W; 235 235 236 236 case ERROR_DISK_CHANGE: // 107 237 237 return ERROR_DISK_CHANGE_W; 238 238 239 239 case ERROR_DRIVE_LOCKED: //108 240 240 return ERROR_DRIVE_LOCKED_W; … … 272 272 case ERROR_DISCARDED: //157 273 273 return ERROR_DISCARDED_W; 274 274 275 275 case ERROR_INVALID_EXE_SIGNATURE: // 191 276 276 return ERROR_INVALID_EXE_SIGNATURE_W; 277 277 278 278 case ERROR_EXE_MARKED_INVALID: // 192 279 279 return ERROR_EXE_MARKED_INVALID_W; 280 280 281 281 case ERROR_BAD_EXE_FORMAT: // 193 282 282 return ERROR_BAD_EXE_FORMAT_W; 283 283 284 284 case ERROR_FILENAME_EXCED_RANGE: //206 285 285 return ERROR_FILENAME_EXCED_RANGE_W; … … 311 311 case ERROR_EAS_DIDNT_FIT: //275 312 312 return ERROR_EAS_DIDNT_FIT; 313 313 314 314 // device driver specific error codes (I24) 315 315 case ERROR_USER_DEFINED_BASE + ERROR_I24_WRITE_PROTECT: 316 316 return ERROR_WRITE_PROTECT_W; 317 317 318 318 case ERROR_USER_DEFINED_BASE + ERROR_I24_BAD_UNIT: 319 319 return ERROR_BAD_UNIT_W; 320 320 321 321 case ERROR_USER_DEFINED_BASE + ERROR_I24_NOT_READY: 322 322 return ERROR_NOT_READY_W; 323 323 324 324 case ERROR_USER_DEFINED_BASE + ERROR_I24_BAD_COMMAND: 325 325 return ERROR_BAD_COMMAND_W; 326 326 327 327 case ERROR_USER_DEFINED_BASE + ERROR_I24_CRC: 328 328 return ERROR_CRC_W; 329 329 330 330 case ERROR_USER_DEFINED_BASE + ERROR_I24_BAD_LENGTH: 331 331 return ERROR_BAD_LENGTH_W; 332 332 333 333 case ERROR_USER_DEFINED_BASE + ERROR_I24_SEEK: 334 334 return ERROR_SEEK_W; 335 335 336 336 case ERROR_USER_DEFINED_BASE + ERROR_I24_NOT_DOS_DISK: 337 337 return ERROR_NOT_DOS_DISK_W; 338 338 339 339 case ERROR_USER_DEFINED_BASE + ERROR_I24_SECTOR_NOT_FOUND: 340 340 return ERROR_SECTOR_NOT_FOUND_W; 341 341 342 342 // @@@PH this error code is not defined in winconst.h 343 343 // case ERROR_USER_DEFINED_BASE + ERROR_I24_OUT_OF_PAPER: … … 346 346 case ERROR_USER_DEFINED_BASE + ERROR_I24_WRITE_FAULT: 347 347 return ERROR_WRITE_FAULT_W; 348 348 349 349 case ERROR_USER_DEFINED_BASE + ERROR_I24_READ_FAULT: 350 350 return ERROR_READ_FAULT_W; 351 351 352 352 case ERROR_USER_DEFINED_BASE + ERROR_I24_GEN_FAILURE: 353 353 return ERROR_GEN_FAILURE_W; 354 354 355 355 case ERROR_USER_DEFINED_BASE + ERROR_I24_DISK_CHANGE: 356 356 return ERROR_DISK_CHANGE_W; 357 357 358 358 case ERROR_USER_DEFINED_BASE + ERROR_I24_WRONG_DISK: 359 359 return ERROR_WRONG_DISK_W; 360 360 361 361 case ERROR_USER_DEFINED_BASE + ERROR_I24_INVALID_PARAMETER: 362 362 return ERROR_INVALID_PARAMETER_W; 363 363 364 364 case ERROR_USER_DEFINED_BASE + ERROR_I24_DEVICE_IN_USE: 365 365 return ERROR_DEVICE_IN_USE_W; 366 366 367 367 default: 368 368 dprintf(("WARNING: error2WinError: error %d not included!!!!", rc)); … … 487 487 *lplpMemAddr = pvMemAddr; 488 488 489 return rc; 489 return rc; 490 490 } 491 491 //****************************************************************************** … … 587 587 ULONG ulAction; 588 588 DWORD os2flags = OPEN_FLAGS_NOINHERIT; 589 char lOemFileName[260]; 589 char lOemFileName[260]; 590 590 591 591 CharToOemA(lpszFileName, lOemFileName); … … 617 617 os2flags, 618 618 0L); /* No extended attribute */ 619 if(rc) 620 { 621 if(rc == ERROR_TOO_MANY_OPEN_FILES) 619 if(rc) 620 { 621 if(rc == ERROR_TOO_MANY_OPEN_FILES) 622 622 { 623 623 ULONG CurMaxFH; … … 625 625 626 626 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 627 if(rc) 627 if(rc) 628 628 { 629 629 dprintf(("DosSetRelMaxFH returned %d", rc)); … … 633 633 goto tryopen; 634 634 } 635 635 636 636 SetLastError(error2WinError(rc)); 637 637 return 0; 638 638 } 639 639 640 640 // OK, file was opened 641 641 SetLastError(ERROR_SUCCESS_W); … … 808 808 { 809 809 APIRET rc; 810 char lOemFileName[260]; 810 char lOemFileName[260]; 811 811 812 812 CharToOemA(lpszFileName, lOemFileName); … … 1671 1671 DWORD hPipe; 1672 1672 DWORD rc, ulAction; 1673 1673 1674 1674 if (dwOpenMode & PIPE_ACCESS_DUPLEX_W) 1675 1675 dwOS2Mode |= NP_ACCESS_DUPLEX; … … 1724 1724 //create the named pipe 1725 1725 rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, FILE_NORMAL, FILE_OPEN, 1726 ((dwOpenMode & PIPE_ACCESS_INBOUND_W) ? OPEN_ACCESS_READWRITE : OPEN_ACCESS_READONLY) | 1726 ((dwOpenMode & PIPE_ACCESS_INBOUND_W) ? OPEN_ACCESS_READWRITE : OPEN_ACCESS_READONLY) | 1727 1727 OPEN_SHARE_DENYNONE, NULL); 1728 1728 … … 1792 1792 DWORD fuCreate, 1793 1793 DWORD fuAttrFlags) 1794 { 1794 { 1795 1795 LPSTR lpOS2Name; 1796 1796 ULONG hPipe; … … 1798 1798 ULONG openFlag = 0; 1799 1799 ULONG openMode = 0; 1800 1800 1801 1801 1802 1802 switch(fuCreate) … … 1867 1867 else lpOS2Name = (LPSTR)lpName; 1868 1868 1869 rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, 0, 1869 rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, 0, 1870 1870 openFlag, openMode, NULL); 1871 1871 … … 2285 2285 2286 2286 ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS_W); 2287 char lOemFileName[260]; 2287 char lOemFileName[260]; 2288 2288 2289 2289 CharToOemA(lpFileName, lOemFileName); … … 2339 2339 2340 2340 ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS_W); 2341 char lOemFileName[260]; 2341 char lOemFileName[260]; 2342 2342 2343 2343 CharToOemA(lpFileName, lOemFileName); … … 2614 2614 //****************************************************************************** 2615 2615 2616 #define FSAttachSpace 1002617 2618 2616 #define CDType 0x8000 2619 2617 #define FloppyType 0x4000 … … 2638 2636 2639 2637 // used for input to logical disk Get device parms Ioctl 2640 struct { 2641 UCHAR Infotype; 2642 UCHAR DriveUnit; 2643 } DriveRequest; 2644 2645 // used for CD number of units Ioctl 2646 struct { 2647 USHORT count; 2648 USHORT first; 2649 } cdinfo; 2650 2651 //****************************************************************************** 2652 ULONG OSLibGetDriveType(ULONG DriveIndex) 2653 { 2654 ULONG ulDriveNum = 0; 2655 ULONG ulDriveMap = 0; 2656 APIRET rc; 2657 ULONG parmsize,datasize; 2658 ULONG mask,Action; 2659 HFILE handle; 2660 UCHAR devname[5]="c:"; 2661 PFSQBUFFER2 fsinfo; 2662 ULONG len; 2663 PSZ name; 2664 BIOSPARAMETERBLOCK device = {0}; 2665 UINT type; 2666 2667 rc = DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap); 2668 mask = 1 << DriveIndex; 2669 2670 if(rc == NO_ERROR && (mask & ulDriveMap)) 2671 {//drive present?? 2672 parmsize=sizeof(DriveRequest); 2673 datasize=sizeof(device); 2674 DriveRequest.Infotype = 0; 2675 DriveRequest.DriveUnit = (UCHAR)DriveIndex; 2676 2677 // Get BIOS parameter block 2678 if(DosDevIOCtl(-1, IOCTL_DISK,DSK_GETDEVICEPARAMS, 2679 (PVOID)&DriveRequest, sizeof(DriveRequest), 2680 &parmsize, (PVOID)&device, 2681 sizeof(BIOSPARAMETERBLOCK), &datasize) == NO_ERROR) 2638 #pragma pack(1) 2639 typedef struct 2640 { 2641 UCHAR Infotype; 2642 UCHAR DriveUnit; 2643 } DSKREQ; 2644 2645 /*------------------------------------------------* 2646 * Cat 0x82, Func 0x60: Return Drive Letter Info * 2647 *------------------------------------------------*/ 2648 typedef struct DriveLetter_Data 2649 { 2650 USHORT drive_count; 2651 USHORT first_drive_number; 2652 } CDDRVLTR; 2653 #pragma pack() 2654 2655 2656 /** 2657 * Determin the type of a specific drive or the current drive. 2658 * 2659 * @returns DRIVE_UNKNOWN 2660 * DRIVE_NO_ROOT_DIR 2661 * DRIVE_CANNOTDETERMINE 2662 * DRIVE_DOESNOTEXIST 2663 * DRIVE_REMOVABLE 2664 * DRIVE_FIXED 2665 * DRIVE_REMOTE 2666 * DRIVE_CDROM 2667 * DRIVE_RAMDISK 2668 * 2669 * @param ulDrive Index of the drive which type we query. 2670 * 2671 * @status completely implemented and tested 2672 * @author Vitali Pelenyov <sunlover@anduin.net> 2673 * @author bird 2674 */ 2675 ULONG OSLibGetDriveType(ULONG ulDrive) 2676 { 2677 ULONG cbParm; 2678 ULONG cbData; 2679 ULONG ulDriveNum = 0; 2680 ULONG ulDriveMap = 0; 2681 APIRET rc; 2682 ULONG ulDriveType; 2683 2684 2685 /* 2686 * Check if drive is present in the logical drive mask, 2687 */ 2688 if ( DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap) 2689 || !(ulDriveMap & (1 << ulDrive)) 2690 ) 2691 return DRIVE_DOESNOTEXIST_W; 2692 2693 2694 /* 2695 * Optimize floppy queries for A: and B:. 2696 * (I don't hope these are any subject of change.) 2697 */ 2698 static ULONG ulFloppyMask = 0; 2699 if (ulFloppyMask & (1 << ulDrive)) 2700 return DRIVE_REMOVABLE_W; 2701 2702 2703 /* 2704 * Check for CD drives 2705 * We don't have to this everytime. I mean, the os2cdrom.dmd is 2706 * exactly very dynamic when it comes to this info. 2707 */ 2708 static CDDRVLTR cdDrvLtr = {0xffff, 0xffff}; 2709 if (cdDrvLtr.drive_count == 0xffff) 2710 { 2711 HFILE hCDRom2; 2712 ULONG ulAction = 0; 2713 2714 if (DosOpen("\\DEV\\CD-ROM2$", &hCDRom2, &ulAction, 0, 2715 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, 2716 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL) 2717 == NO_ERROR) 2682 2718 { 2683 if(device.bDeviceType == 0 && device.fsDeviceAttr == 0) 2684 { // fix for LAN type drives 2685 device.fsDeviceAttr = LanType; 2686 } 2687 } 2688 else {//could be a LAN drive 2689 device.fsDeviceAttr = LanType; 2719 #define IOC_CDROM_2 0x82 /* from cdioctl.h (ddk, os2cdrom.dmd sample) */ 2720 #define IOCD_RETURN_DRIVE_LETTER 0x60 2721 cbData = sizeof(cdDrvLtr); 2722 rc = DosDevIOCtl(hCDRom2, 2723 IOC_CDROM_2, 2724 IOCD_RETURN_DRIVE_LETTER, 2725 NULL, 0, NULL, 2726 (PVOID)&cdDrvLtr, sizeof(cdDrvLtr), &cbData); 2727 DosClose(hCDRom2); 2690 2728 } 2691 2729 } 2692 else { 2693 //drive not present -> fail 2694 return DRIVE_DOESNOTEXIST_W; 2730 2731 2732 /* 2733 * Is the drive present?? Lets the the BPB to check this. 2734 * this should be a pretty speedy call if I'm not much mistaken. 2735 */ 2736 BIOSPARAMETERBLOCK bpb = {0}; 2737 DSKREQ DskReq; 2738 DskReq.Infotype = 0; 2739 DskReq.DriveUnit = (UCHAR)ulDrive; 2740 cbParm = sizeof(DskReq); 2741 cbData = sizeof(bpb); 2742 if (DosDevIOCtl(-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, 2743 (PVOID)&DskReq, sizeof(DskReq), &cbParm, 2744 (PVOID)&bpb, sizeof(BIOSPARAMETERBLOCK), &cbData) 2745 == NO_ERROR) 2746 { 2747 if (bpb.bDeviceType == 0 && bpb.fsDeviceAttr == 0) 2748 bpb.fsDeviceAttr = LanType; // fix for LAN type drives 2695 2749 } 2696 2697 // check for CD drives 2698 if(DosOpen("\\DEV\\CD-ROM2$", &handle,&Action, 2699 0, FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, 2700 OPEN_SHARE_DENYNONE|OPEN_ACCESS_READONLY, NULL) == 0) 2750 else 2751 bpb.fsDeviceAttr = LanType; //could be a LAN drive - could it?? 2752 2753 2754 /* 2755 * This is a CDROM/DVD drive 2756 * 2757 * Fix: When the cdrom is not last drive letter that 2758 * sometimes reports wrong index, have to check 2759 * that device type can be a CDROM one. 2760 */ 2761 if ( cdDrvLtr.drive_count > 0 2762 && (bpb.bDeviceType == DEVTYPE_UNKNOWN || bpb.bDeviceType == DEVTYPE_OPTICAL) // Other or RW optical 2763 && ulDrive >= cdDrvLtr.first_drive_number 2764 && ulDrive < cdDrvLtr.first_drive_number + cdDrvLtr.drive_count 2765 ) 2766 bpb.fsDeviceAttr |= CDType; 2767 2768 2769 if (bpb.bDeviceType || bpb.fsDeviceAttr == LanType) 2701 2770 { 2702 datasize=sizeof(cdinfo); 2703 rc = DosDevIOCtl(handle, 0x82, 0x60, 2704 NULL, 0, 2705 NULL, (PVOID)&cdinfo, 2706 sizeof(cdinfo), 2707 &datasize); 2708 if(rc == NO_ERROR) 2709 { 2710 // this is a CDROM/DVD drive 2711 // CDROM detection fix 2712 // when cdrom is not last drive letter that sometimes 2713 // reports wrong index, have to check that device type 2714 // can be a CDROM one 2715 if(device.bDeviceType == 7 || device.bDeviceType == 8) // Other or RW optical 2716 // /CDROM detection fix 2717 if(cdinfo.first <= DriveIndex && DriveIndex < cdinfo.first + cdinfo.count) 2718 device.fsDeviceAttr |= CDType; 2719 } 2720 DosClose(handle); 2721 } 2722 2723 // disable error popups 2724 DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR); 2725 2726 fsinfo = (PFSQBUFFER2)malloc(FSAttachSpace); 2727 2728 // if the device is removable and NOT a CD 2729 if(device.bDeviceType || device.fsDeviceAttr == LanType) 2730 { 2731 if((device.fsDeviceAttr & (CDType | NonRemovable)) == 0) 2732 { 2733 devname[0] = (UCHAR)(DriveIndex+Binary_to_Printable); 2734 len = FSAttachSpace; 2735 rc = DosQueryFSAttach((PSZ) devname, 0L, FSAIL_QUERYNAME, 2736 fsinfo, &len); 2737 if(rc == NO_ERROR) 2771 if ((bpb.fsDeviceAttr & (CDType | NonRemovable)) == 0) 2772 { // if the device is removable and NOT a CD 2773 CHAR szDevName[4] = "A:"; 2774 PFSQBUFFER2 pfsqbuf2; 2775 2776 szDevName[0] += ulDrive; 2777 cbData = sizeof(PFSQBUFFER2) + 3 * CCHMAXPATH; 2778 pfsqbuf2 = (PFSQBUFFER2)malloc(cbData); 2779 DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR); // disable error popups 2780 rc = DosQueryFSAttach(&szDevName[0], 0L, FSAIL_QUERYNAME, pfsqbuf2, &cbData); 2781 if (rc == NO_ERROR) 2738 2782 { 2739 if(fsinfo->iType == FSAT_REMOTEDRV) { 2740 device.fsDeviceAttr |= LanType; 2741 } 2742 else 2743 if(fsinfo->iType == FSAT_LOCALDRV) 2783 if (pfsqbuf2->iType == FSAT_REMOTEDRV) 2784 bpb.fsDeviceAttr |= LanType; 2785 else if (pfsqbuf2->iType == FSAT_LOCALDRV) 2744 2786 { 2745 name = (char *) fsinfo->szName; 2746 name += strlen(name)+1; 2747 if(strcmp(name,"FAT") == 0) 2787 PSZ pszFSName = (PSZ)pfsqbuf2->szName + pfsqbuf2->cbName; 2788 if (!strcmp(pszFSName, "FAT")) 2748 2789 { 2749 2790 // device is a removable FAT drive, so it MUST be diskette 2750 2791 // as Optical has another name as does LAN and SRVIFS 2751 if(device.bSectorsPerCluster != OpticalSectorsPerCluster) 2752 { 2753 device.fsDeviceAttr |= FloppyType; 2754 } 2755 else device.fsDeviceAttr |= OpticalType; 2792 if (bpb.bSectorsPerCluster != OpticalSectorsPerCluster) 2793 bpb.fsDeviceAttr |= FloppyType; 2794 else 2795 bpb.fsDeviceAttr |= OpticalType; 2756 2796 } 2757 // CDROM detection fix 2797 /* 2798 * CDROM detection fix 2799 */ 2758 2800 else 2759 2801 { 2760 2802 // device is removable non-FAT, maybe it is CD? 2761 if (device.bDeviceType == 7 && 2762 device.bMedia == 5 && 2763 device.usBytesPerSector > 512) 2764 { 2765 device.fsDeviceAttr |= CDType; 2766 } 2803 if ( bpb.bDeviceType == DEVTYPE_UNKNOWN 2804 && bpb.bMedia == 5 2805 && bpb.usBytesPerSector > 512 2806 ) 2807 bpb.fsDeviceAttr |= CDType; 2767 2808 } 2768 2809 // CDROM detection fix 2769 2810 } 2770 2811 } 2771 2812 else // must be no media or audio only (for CDs at least) 2772 2813 { 2773 if(device.cCylinders <= DisketteCylinders) // floppies will always be 80 2774 { // or less cylinders 2775 if(device.bSectorsPerCluster != OpticalSectorsPerCluster) { 2776 device.fsDeviceAttr |= FloppyType; 2777 } 2778 else device.fsDeviceAttr |= OpticalType; 2814 if (bpb.cCylinders <= DisketteCylinders) // floppies will always be 80 2815 { 2816 // or less cylinders 2817 if (bpb.bSectorsPerCluster != OpticalSectorsPerCluster) 2818 bpb.fsDeviceAttr |= FloppyType; 2819 else 2820 bpb.fsDeviceAttr |= OpticalType; 2779 2821 } 2780 2822 } 2781 } 2782 else 2823 2824 //Enable error popups again 2825 DosError(FERR_ENABLEEXCEPTION | FERR_ENABLEHARDERR); 2826 2827 free(pfsqbuf2); 2828 } 2829 else 2783 2830 {// non removable or CD type. maybe RAM disk 2784 if (!(device.fsDeviceAttr & CDType)) // if NOT CD2831 if (!(bpb.fsDeviceAttr & CDType)) // if NOT CD 2785 2832 { 2786 if (device.cFATs == 1) // is there only one FAT?2787 device.fsDeviceAttr |= VDISKType; // -> RAM disk2833 if (bpb.cFATs == 1) // is there only one FAT? 2834 bpb.fsDeviceAttr |= VDISKType; // -> RAM disk 2788 2835 } 2789 2836 } 2790 2837 } 2791 free(fsinfo); 2792 2793 if(device.fsDeviceAttr & FloppyType) { 2794 type = DRIVE_REMOVABLE_W; 2838 2839 2840 /* 2841 * Determin return value. 2842 */ 2843 if (bpb.fsDeviceAttr & FloppyType) 2844 { 2845 ulDriveType = DRIVE_REMOVABLE_W; 2846 /* update floppy cache if A or B */ 2847 if (ulDrive <= 1) 2848 ulFloppyMask |= 1 << ulDrive; 2795 2849 } 2796 else 2797 if(device.fsDeviceAttr & CDType) { 2798 type = DRIVE_CDROM_W; 2799 } 2800 else 2801 if(device.fsDeviceAttr & LanType) { 2802 type = DRIVE_REMOTE_W; 2803 } 2804 else 2805 if(device.fsDeviceAttr & VDISKType) { 2806 type = DRIVE_RAMDISK_W; 2807 } 2808 else 2809 if(device.fsDeviceAttr & OpticalType || device.bDeviceType == DEVTYPE_OPTICAL) { 2810 type = DRIVE_FIXED_W; 2811 } 2812 else 2813 if(device.bDeviceType == DEVTYPE_FIXED) { 2814 type = DRIVE_FIXED_W; 2815 } 2816 else type = 0; 2817 2818 //Enable error popups again 2819 DosError(FERR_ENABLEEXCEPTION | FERR_ENABLEHARDERR); 2820 2821 return type; 2850 else if (bpb.fsDeviceAttr & CDType) 2851 ulDriveType = DRIVE_CDROM_W; 2852 else if (bpb.fsDeviceAttr & LanType) 2853 ulDriveType = DRIVE_REMOTE_W; 2854 else if (bpb.fsDeviceAttr & VDISKType) 2855 ulDriveType = DRIVE_RAMDISK_W; 2856 else if (bpb.fsDeviceAttr & OpticalType || bpb.bDeviceType == DEVTYPE_OPTICAL) 2857 ulDriveType = DRIVE_FIXED_W; 2858 else if (bpb.bDeviceType == DEVTYPE_FIXED) 2859 ulDriveType = DRIVE_FIXED_W; 2860 else 2861 ulDriveType = DRIVE_UNKNOWN_W; 2862 2863 return ulDriveType; 2822 2864 } 2823 2865 //****************************************************************************** … … 2896 2938 PVOID pTiledData = pData; 2897 2939 BOOL flagTiledData = FALSE; 2898 2940 2899 2941 #define MEM_TILED_CEILING 0x1fffffff 2900 2942 2901 2943 // bounce buffer support 2902 2944 // make sure no parameter or data buffer can pass the tiled memory region … … 2910 2952 if (rc) 2911 2953 goto _exit_ioctl; 2912 2954 2913 2955 flagTiledParm = TRUE; 2914 2956 } 2915 2957 2916 2958 if (pTiledData && (((DWORD)pTiledData + max(dwDataMaxLen, *pdwDataLen)) > MEM_TILED_CEILING)) 2917 2959 { … … 2919 2961 if (rc) 2920 2962 goto _exit_ioctl; 2921 2963 2922 2964 flagTiledData = TRUE; 2923 2965 } … … 2927 2969 if (pTiledParm != pParm) 2928 2970 memcpy(pTiledParm, pParm, *pdwParmLen); 2929 2971 2930 2972 if (pTiledData != pData) 2931 2973 memcpy(pTiledData, pData, *pdwDataLen); … … 2935 2977 pParm, dwParmMaxLen, pdwParmLen, 2936 2978 pData, dwDataMaxLen, pdwDataLen); 2937 2979 2938 2980 // copy data from bounce buffers to real 2939 2981 // target buffers if necessary 2940 2982 if (pTiledParm != pParm) 2941 2983 memcpy(pParm, pTiledParm, *pdwParmLen); 2942 2984 2943 2985 if (pTiledData != pData) 2944 2986 memcpy(pData, pTiledData, *pdwDataLen); 2945 2946 2987 2988 2947 2989 _exit_ioctl: 2948 2990 2949 2991 // deallocate bounce buffers 2950 2992 if (flagTiledParm) 2951 2993 DosFreeMem(pTiledParm); 2952 2994 2953 2995 if (flagTiledData) 2954 2996 DosFreeMem(pTiledData); 2955 2997 2956 2998 rc = error2WinError(rc, ERROR_INVALID_HANDLE); 2957 2999 SetLastError(rc); … … 3091 3133 CHAR pszError[32], pszModule[CCHMAXPATH]; 3092 3134 3093 if(DosQueryModuleName( hmod, CCHMAXPATH, pszModule ) == 0 && 3094 DosLoadModule( pszError, 32, pszModule, &hmod ) == 0) 3135 if(DosQueryModuleName( hmod, CCHMAXPATH, pszModule ) == 0 && 3136 DosLoadModule( pszError, 32, pszModule, &hmod ) == 0) 3095 3137 { 3096 3138 rc = DosQueryProcAddr(hmod, ordinal, (PSZ)lpszProc, &pfn); … … 3110 3152 APIRET rc; 3111 3153 3112 if(fInit == FALSE && pfnDosSetThreadAffinity == NULL) 3154 if(fInit == FALSE && pfnDosSetThreadAffinity == NULL) 3113 3155 { 3114 3156 ULONG nrCPUs; 3115 3157 3116 3158 rc = DosQuerySysInfo(QSV_NUMPROCESSORS, QSV_NUMPROCESSORS, &nrCPUs, sizeof(nrCPUs)); 3117 if (rc != 0 || nrCPUs == 1) 3159 if (rc != 0 || nrCPUs == 1) 3118 3160 {//not supported 3119 3161 fInit = TRUE; … … 3152 3194 APIRET rc; 3153 3195 3154 if(fInit == FALSE && pfnDosQueryThreadAffinity == NULL) 3196 if(fInit == FALSE && pfnDosQueryThreadAffinity == NULL) 3155 3197 { 3156 3198 ULONG nrCPUs; 3157 3199 3158 3200 rc = DosQuerySysInfo(QSV_NUMPROCESSORS, QSV_NUMPROCESSORS, &nrCPUs, sizeof(nrCPUs)); 3159 if (rc != 0 || nrCPUs == 1) 3201 if (rc != 0 || nrCPUs == 1) 3160 3202 {//not supported 3161 3203 fInit = TRUE; … … 3199 3241 APIRET rc; 3200 3242 3201 switch(priority) 3243 switch(priority) 3202 3244 { 3203 3245 case THREAD_PRIORITY_IDLE_W:
Note:
See TracChangeset
for help on using the changeset viewer.