KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q62214: Calling API Function to Get All Available Drives

Article: Q62214
Product(s): See article
Version(s): 6.00 6.00b 7.00
Operating System(s): OS/2
Keyword(s): ENDUSER | SR# S900517-71 | mspl13_basic
Last Modified: 7-JUN-1990

Microsoft BASIC Compiler versions 6.00 and 6.00b and Microsoft BASIC
Professional Development System (PDS) version 7.00 protected mode
programs can call the OS/2 API function DosQCurDisk() to get all the
available logical drives. DosQCurDisk() requires the following
parameters:

   Parameter   Description
   ---------   -----------

   PTR WORD    Receives current drive code (1 = A, 2 = B, etc.)

   PTR DWORD   Receives logical drive bitmap (logical drives A-Z
               correspond to bits 0-25; a bit is set if a
               logical drive exists)

The first parameter is not important in getting the available drives,
but it is worthy to note that for API functions, a WORD (2 bytes) has
a BASIC type of INTEGER. Likewise, a DWORD (4 bytes) has a BASIC type
of LONG. Since the specification requires pointers to these data
items, the DECLARE statement for DosQCurDisk() uses the SEG keyword for
each of the parameters. This causes 4-byte addresses of the parameters
to be passed instead of 2-byte addresses, which is the default because
BASIC uses the medium-memory model. Also, API functions return an
error code, so for BASIC to retrieve this code, you must declare
DosQCurDisk() as a FUNCTION.

This information applies to Microsoft BASIC Compiler versions 6.00 and
6.00b for MS OS/2 and Microsoft BASIC (PDS) version 7.00 for MS OS/2.

For more information on calling OS/2 API functions from Microsoft
BASIC Compiler versions 6.00 and 6.00b, see Page 21 of the "Microsoft
BASIC Compiler 6.0: User's Guide" included with the product.

For more information on calling OS/2 API functions from Microsoft
BASIC PDS version 7.00, see Page 523 of the "Microsoft BASIC 7.0:
Programmer's Guide" included with the product.

For more information on DosQCurDisk(), see Page 547 of "Advanced OS/2
Programming," by Ray Duncan (Microsoft Press, 1989).

To see a BASIC PDS 7.00 sample program that finds all the available
drives in DOS or OS/2 real mode, query in this Knowledge Base on the
word "chdrive".

The following sample program (LOGICAL.BAS) reports all the available
logical drives.

To compile the program, use the following:

   bc logical /lp;

To link the program for BASIC 6.00 and 6.00b, use the following:

   link /nop logical,,,doscalls;

To link the program for BASIC 7.00, use the following:

   link /nop logical,,,os2;

Code Example
------------

' This declaration was taken from the include file
BSEDOSFL.BI.

DECLARE FUNCTION DosQCurDisk% (SEG CurrentDrive AS INTEGER,_
                               SEG DriveBitmap  AS LONG)

' CurrentDrive% receives the current drive code (A=1, B=2,
' etc.). DriveBitmap& receives a bitmap of each logical
' drive's availability.
ErrorCode% = DosQCurDisk% (CurrentDrive%, DriveBitmap&)

IF ErrorCode% THEN

   PRINT "An error occurred, the code is";ErrorCode%

ELSE

   PRINT "The following drives are available:";

   ' Bit% is used to circulate through bits 0-25 (drives A-Z)
   ' of DriveBitmap&.  If (DriveBitmap& AND 2^Bit%) = 2^Bit%,
   ' then bit Bit% of DriveBitmap& is set and the
   ' corresponding logical drive is available.
   FOR Bit% = 0 to 25
      IF (DriveBitmap& AND 2^Bit%) = 2^Bit% THEN
         PRINT " ";CHR$(Bit% + 65);
      END IF
   NEXT Bit%

END IF

END

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.