Detect Drives: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
(Created page.)
 
m (FF: use <highlight-nsis> instead of a list. Added "Page author" line.)
Line 8: Line 8:
== Function Call ==
== Function Call ==


*'''Push''' ''"([Hard Drives][CDROM Drives][Diskette Drives][RAM Drives][Network Drives]|All Drives|All Local Drives|Basic Drives|Disk Needed Drives)"'' ; Drive types used for the search. See "Drive Types".
<highlight-nsis>
*'''Push''' $0
Push "([Hard Drives][CDROM Drives][Diskette Drives][RAM Drives][Network Drives]|All Drives|All Local Drives|Basic Drives|Disk Needed Drives)" ; Drive types used for the search. See "Drive Types".
*'''GetFunctionAddress''' $0 ''"CallbackFunction"'' ; Custom callback function name.
Push $0
*'''Exch''' $0
GetFunctionAddress $0 "CallbackFunction" ; Custom callback function name.
*'''Call''' ''DetectDrives''
Exch $0
Call DetectDrives
</highlight-nsis>


=== Drive Types ===
=== Drive Types ===
Line 256: Line 258:


FunctionEnd</highlight-nsis>
FunctionEnd</highlight-nsis>
Page author: [[User:deguix|deguix]]

Revision as of 20:03, 29 April 2005

Description

Superseded by: GetDrives function.
Requires: System plugin.

This function detects available drives and return their letters (with colon and foward slash, like C:/).

Function Call

Push "([Hard Drives][CDROM Drives][Diskette Drives][RAM Drives][Network Drives]|All Drives|All Local Drives|Basic Drives|Disk Needed Drives)" ; Drive types used for the search. See "Drive Types".
Push $0
GetFunctionAddress $0 "CallbackFunction" ; Custom callback function name.
Exch $0
Call DetectDrives

Drive Types

  • Hard Drives
  • CDROM Drives
  • Diskette Drives
  • RAM Drives
  • Network Drives

You can format the string as you like, but have to be the above strings to work. Some examples:

  • Hard Drives and worst but useful Diskette Drives.
  • CDROM DrivesDiskette Drives.
  • Essential Network Drives and the really needed Hard Drives.

You can also use:

  • All Drives (= Hard Drives, CDROM Drives, Diskette Drives, RAM Drives, Network Drives)
  • All Local Drives (= Hard Drives, CDROM Drives, Diskette Drives, RAM Drives)
  • Basic Drives (= Hard Drives, CDROM Drives, Diskette Drives)
  • Disk Needed Drives (= CDROM Drives, Diskette Drives)

How to Use Callback Function

  • You have to push "Stop" to stop, or anything to continue the search, if you don't push, will occur the stack corruption.
  • Do not push values on the stack without poping them later unless it's the return value.
  • You can use any variables, but $R0 has function result, the drive letter detected.

Function Code

    ;----------------------------------------------------------------------------
    ; Superseded by     : GetDrives function.
    ;----------------------------------------------------------------------------
    ; Title             : Detect drives
    ; Short Name        : DetectDrives
    ; Last Changed      : 22/Feb/2005
    ; Code Type         : Function
    ; Code Sub-Type     : One-way Input, Callback Dependant
    ;----------------------------------------------------------------------------
    ; Required          : System plugin.
    ; Description       : Detects available drives and return their letters
    ;                     (with colon and foward slash, like C:/).
    ;----------------------------------------------------------------------------
    ; Function Call     : Push "([Hard Drives][CDROM Drives][Diskette Drives]
    ;                          [RAM Drives][Network Drives]|All Drives|All Local
    ;                          Drives|Basic Drives|Disk Needed Drives)"
    ;                       Drive types used for the search.
    ;
    ;                     Push $0
    ;
    ;                     GetFunctionAddress $0 "CallbackFunction"
    ;                       Custom callback function name where the search is
    ;                       returned to.
    ;
    ;                     Exch $0
    ;                     Call DetectDrives
    ;----------------------------------------------------------------------------
    ; Callback Variables: $R0 - Drive letter detected with ":/" (like C:/).
    ;----------------------------------------------------------------------------
    ; Author            : Diego Pedroso
    ; Author Reg. Name  : deguix
    ;----------------------------------------------------------------------------
     
    Function DetectDrives
     
      Exch
      Exch $R0
      Exch
      Exch $R1
      Push $R2
      Push $R3
      Push $R4
      Push $R5
      Push $0
      Push $1
      StrCpy $R4 $R1
     
      # Drives Conversion
     
      StrCmp $R0 "All Drives" 0 +2
        StrCpy $R0 "Hard Drives, CDROM Drives, Diskette Drives, RAM Drives, \
        Network Drives"
     
      StrCmp $R0 "All Local Drives" 0 +2
        StrCpy $R0 "Hard Drives, CDROM Drives, Diskette Drives, RAM Drives"
     
      StrCmp $R0 "Basic Drives" 0 +2
        StrCpy $R0 "Hard Drives, CDROM Drives, Diskette Drives"
     
      StrCmp $R0 "Disk Needed Drives" 0 +2
        StrCpy $R0 "CDROM Drives, Diskette Drives"
     
      # Memory for paths
     
      System::Alloc 1024
      Pop $R1
     
      # Get drives
     
      System::Call 'kernel32::GetLogicalDriveStringsA(i, i) i(1024, R1)'
     
      enumok:
     
      # One more drive?
     
      System::Call 'kernel32::lstrlenA(t) i(i R1) .R2'
      IntCmp $R2 0 enumex
     
      # Now, search for drives according to user conditions
     
      System::Call 'kernel32::GetDriveTypeA(t) i (i R1) .R3'
     
      StrCpy $2 0
     
      Search:
     
      IntOp $2 $2 + 1
     
      StrCmp $2 1 0 +3
        StrCpy $0 "Hard Drives"
        StrCpy $1 3
     
      StrCmp $2 2 0 +3
        StrCpy $0 "CDROM Drives"
        StrCpy $1 5
     
      StrCmp $2 3 0 +3
        StrCpy $0 "Diskette Drives"
        StrCpy $1 2
     
      StrCmp $2 4 0 +3
        StrCpy $0 "RAM Drives"
        StrCpy $1 6
     
      StrCmp $2 5 0 +3
        StrCpy $0 "Network Drives"
        StrCpy $1 4
     
      IntCmp $2 6 enumnext 0 enumnext
     
        Push $R1
        Push $R2
        Push $R3
        Push $R4
        Push $R5
     
         StrLen $R3 $0
         StrCpy $R4 0
         loop:
           StrCpy $R5 $R0 $R3 $R4
           StrCmp $R5 $0 done
           StrCmp $R5 "" done
           IntOp $R4 $R4 + 1
           Goto loop
       done:
         StrCpy $R1 $R0 "" $R4
     
         StrCmp $R1 "" 0 +7
     
           Pop $R5
           Pop $R4
           Pop $R3
           Pop $R2
           Pop $R1
           Goto Search
     
         Pop $R5
         Pop $R4
         Pop $R3
         Pop $R2
         Pop $R1
     
         StrCmp $R3 $1 0 Search
     
      # Get drive path string
     
      System::Call '*$R1(&t1024 .R3)'
     
      # Prepare variables for the Callback function
     
      Push $R4
      Push $R3
      Push $R2
      Push $R1
      Push $R0
     
      StrCpy $R0 $R3
     
      # Call the Callback function
     
      Call $R4
     
      # Return variables
     
      Push $R5
      Exch
      Pop $R5
     
      Exch
      Pop $R0
      Exch
      Pop $R1
      Exch
      Pop $R2
      Exch
      Pop $R3
      Exch
      Pop $R4
     
      StrCmp $R5 "Stop" 0 +3
        Pop $R5
        Goto enumex
     
      Pop $R5
     
      enumnext:
     
      # Next drive path
     
      IntOp $R1 $R1 + $R2
      IntOp $R1 $R1 + 1
      goto enumok
     
      # End Search
     
      enumex:
     
      # Free memory used for paths
     
      System::Free $R1
     
      # Return original user variables
     
      Pop $0
      Pop $1
      Pop $R5
      Pop $R4
      Pop $R3
      Pop $R2
      Pop $R1
      Pop $R0
     
    FunctionEnd

    Page author: deguix