Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.         format PE GUI 4.0
  2. section '.text' code readable executable
  3. entry start
  4. start:
  5.         xor     ebx, ebx
  6.         push    ebx     ; lpParam
  7.         push    400000h ; hInstance
  8.         push    ebx     ; hMenu
  9.         push    ebx     ; hWndParent
  10.         push    100     ; nHeight
  11.         push    200     ; nWidth
  12.         mov     eax, 80000000h
  13.         push    eax     ; y
  14.         push    eax     ; x
  15.         push    10EF0140h       ; dwStyle
  16.         push    WndName
  17.         push    ClassName
  18.         push    388h    ; dwExStyle
  19.         call    [CreateWindowExA]
  20.         mov     edi, eax
  21.         push    0Ah     ; OEM_FIXED_FONT
  22.         call    [GetStockObject]
  23.         push    ebx
  24.         push    eax
  25.         push    30h     ; WM_SETFONT
  26.         push    edi
  27.         call    [SendMessageA]
  28.         call    CollectDrivesInfo
  29.         push    MyWndProc
  30.         push    -4      ; GWL_WNDPROC
  31.         push    edi
  32.         call    [SetWindowLongA]
  33.         mov     [OldWndProc], eax
  34.         sub     esp, 20h
  35.         mov     esi, esp
  36. @@:
  37.         push    ebx
  38.         push    ebx
  39.         push    ebx
  40.         push    esi
  41.         call    [GetMessageA]
  42.         test    eax, eax
  43.         jz      @f
  44.         push    esi
  45.         call    [TranslateMessage]
  46.         push    esi
  47.         call    [DispatchMessageA]
  48.         jmp     @b
  49. @@:
  50.         add     esp, 20h
  51.         ret
  52.  
  53. MyWndProc:
  54.         push    edi
  55.         mov     edi, [esp+8]
  56.         cmp     dword [esp+12], 2       ; WM_DESTROY
  57.         jnz     @f
  58.         push    0
  59.         call    [PostQuitMessage]
  60. @@:
  61.         cmp     dword [esp+12], 219h    ; WM_DEVICECHANGE
  62.         jnz     w
  63.         cmp     dword [esp+16], 8000h   ; DBT_DEVICEARRIVAL
  64.         jz      @f
  65.         cmp     dword [esp+16], 8004h   ; DBT_DEVICEREMOVECOMPLETE
  66.         jnz     w
  67. @@:
  68.         call    UpdateDrivesInfo
  69. w:
  70.         cmp     dword [esp+12], 203h    ; WM_LBUTTONDBLCLK
  71.         jnz     @f
  72.         push    0
  73.         push    0
  74.         push    188h    ; LB_GETCURSEL
  75.         push    edi
  76.         call    [SendMessageA]
  77.         cmp     eax, -1
  78.         jz      @f
  79.         push    n+4
  80.         push    eax
  81.         push    189h    ; LB_GETTEXT
  82.         push    edi
  83.         call    [SendMessageA]
  84.         mov     dword [n], '\\.\'
  85.         mov     byte [n+4+aPhysicalDrive.sz], 0
  86.         call    install
  87. @@:
  88.         pop     edi
  89.         pop     eax
  90.         push    [OldWndProc]
  91.         push    eax
  92.         jmp     [CallWindowProcA]
  93.  
  94. UpdateDrivesInfo:
  95.         push    0
  96.         push    0
  97.         push    184h    ; LB_RESETCONTENT
  98.         push    edi
  99.         call    [SendMessageA]
  100.  
  101. CollectDrivesInfo:
  102.         xor     eax, eax
  103.         mov     ecx, 32
  104.         push    edi
  105.         mov     edi, PhysicalDrives
  106.         rep     stosd
  107.         pop     edi
  108.         push    esi
  109.         call    [GetLogicalDrives]
  110.         mov     esi, eax
  111.         mov     [a], 'A'
  112. l:
  113.         shr     esi, 1
  114.         jnc     d
  115.         mov     [a+2], 0
  116.         push    a
  117.         call    [GetDriveTypeA]
  118. ; Uncomment following lines to allow hard drives
  119. ;       cmp     eax, 3  ; DRIVE_FIXED
  120. ;       jz      @f
  121.         cmp     eax, 2  ; DRIVE_REMOVABLE
  122.         jnz     d
  123. @@:
  124.         push    0       ; hTemplateFile
  125.         push    0       ; dwFlagsAndAttributes
  126.         push    3       ; dwCreationDisposition = OPEN_EXISTING
  127.         push    0       ; lpSecurityAttributes
  128.         push    3       ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
  129.         push    0       ; dwDesiredAccess
  130.         push    a2
  131.         call    [CreateFileA]
  132.         cmp     eax, -1
  133.         jz      d
  134.         push    eax
  135.         push    0
  136.         mov     ecx, esp
  137.         push    0       ; lpOverlapped
  138.         push    ecx     ; lpBytesReturned
  139.         push    12      ; nOutBufferSize
  140.         push    sdn     ; lpOutBuffer
  141.         push    0
  142.         push    0
  143.         push    2D1080h ; IOCTL_STORAGE_GET_DEVICE_NUMBER
  144.         push    eax
  145.         call    [DeviceIoControl]
  146.         pop     ecx
  147.         pop     edx
  148.         push    eax
  149.         push    edx
  150.         call    [CloseHandle]
  151.         pop     eax
  152.         test    eax, eax
  153.         jz      d       ; probably it is floppy
  154.         mov     eax, [sdn+4]
  155.         cmp     eax, 32
  156.         jae     d
  157.         movzx   ecx, byte [a]
  158.         sub     cl, 'A'
  159.         bts     [PhysicalDrives+eax*4], ecx
  160. d:
  161.         inc     [a]
  162.         test    esi, esi
  163.         jnz     l
  164.         xor     esi, esi
  165. .physloop:
  166.         push    esi
  167.         mov     esi, [PhysicalDrives+esi*4]
  168.         test    esi, esi
  169.         jz      .physnext
  170.         push    edi esi
  171.         mov     esi, aPhysicalDrive
  172.         mov     edi, n
  173. @@:
  174.         lodsb
  175.         stosb
  176.         test    al, al
  177.         jnz     @b
  178.         pop     esi
  179.         dec     edi
  180.         mov     eax, [esp+4]
  181.         cmp     al, 10
  182.         jb      .1dig
  183.         aam
  184.         add     ah, '0'
  185.         mov     byte [edi], ah
  186.         inc     edi
  187. .1dig:
  188.         add     al, '0'
  189.         stosb
  190.         mov     al, ':'
  191.         stosb
  192.         mov     cl, 'A'-1
  193. .logloop:
  194.         mov     al, ' '
  195.         stosb
  196.         mov     al, cl
  197.         stosb
  198. @@:
  199.         inc     byte [edi-1]
  200.         shr     esi, 1
  201.         jnc     @b
  202.         mov     cl, [edi-1]
  203.         mov     al, ':'
  204.         stosb
  205.         mov     al, '\'
  206.         stosb
  207.         test    esi, esi
  208.         jnz     .logloop
  209.         mov     al, 0
  210.         stosb
  211.         pop     edi
  212.         push    n
  213.         push    0
  214.         push    180h    ; LB_ADDSTRING
  215.         push    edi
  216.         call    [SendMessageA]
  217. .physnext:
  218.         pop     esi
  219.         inc     esi
  220.         cmp     esi, 32
  221.         jb      .physloop
  222.         pop     esi
  223.         ret
  224.  
  225. install:
  226.         push    0       ; hTemplateFile
  227.         push    0       ; dwFlagsAndAttributes
  228.         push    3       ; dwCreationDisposition = OPEN_EXISTING
  229.         push    0       ; lpSecurityAttributes
  230.         push    3       ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
  231.         push    0C0000000h      ; dwDesiredAccess = GENERIC_READ|GENERIC_WRITE
  232.         push    n
  233.         call    [CreateFileA]
  234.         cmp     eax, -1
  235.         jnz     @f
  236. deverre:
  237.         push    10h
  238.         push    0
  239.         push    deverr
  240.         push    edi
  241.         call    [MessageBoxA]
  242.         ret
  243. @@:
  244.         push    esi
  245.         mov     esi, eax
  246.         push    eax
  247.         mov     eax, esp
  248.         push    0
  249.         push    eax
  250.         push    512
  251.         push    mbr_dev
  252.         push    esi
  253.         call    [ReadFile]
  254.         test    eax, eax
  255.         jnz     @f
  256. deverrl:
  257.         push    esi
  258.         call    [CloseHandle]
  259.         pop     eax
  260.         pop     esi
  261.         jmp     deverre
  262. @@:
  263.         push    esi edi
  264.         mov     esi, mbr_new
  265.         mov     edi, mbr_dev
  266.         mov     ecx, 1B8h
  267.         rep     movsb
  268.         mov     al, [edi+6]
  269.         or      al, [edi+16h]
  270.         or      al, [edi+26h]
  271.         or      al, [edi+36h]
  272.         test    al, al
  273.         js      @f
  274.         or      byte [edi+6], 80h
  275. @@:
  276.         pop     edi esi
  277.         push    0
  278.         push    0
  279.         push    0
  280.         push    esi
  281.         call    [SetFilePointer]
  282.         test    eax, eax
  283.         jnz     deverrl
  284.         mov     eax, esp
  285.         push    0
  286.         push    eax
  287.         push    512
  288.         push    mbr_dev
  289.         push    esi
  290.         call    [WriteFile]
  291.         test    eax, eax
  292.         jz      deverrl
  293.         cmp     dword [esp], 512
  294.         jnz     deverrl
  295. ; done!
  296. done_succ:
  297.         push    40h
  298.         push    ok
  299.         push    succ
  300.         push    edi
  301.         call    [MessageBoxA]
  302.         push    0
  303.         call    [PostQuitMessage]
  304. r:
  305.         pop     eax
  306.         push    esi
  307.         call    [CloseHandle]
  308.         pop     esi
  309.         ret
  310.  
  311. section '.data' data readable writable
  312. data resource from 'rsrc.res'
  313. end data
  314.  
  315. ClassName db    'LISTBOX',0
  316. WndName db      'Select drive',0
  317. deverr  db      'Cannot open physical device or device error (no administrator rights?)',0
  318. ok      db      'Success',0
  319. succ    db      'Standard MBR has been installed',0
  320. a2      db      '\\.\'
  321. a       db      '?:',0,0
  322. aPhysicalDrive  db      'PhysicalDrive',0
  323. .sz = $ - aPhysicalDrive
  324.  
  325. data import
  326. macro thunk a
  327. {a#_thunk:dw 0
  328. db `a,0}
  329.         dd      0,0,0, rva kernel32_name, rva kernel32_thunks
  330.         dd      0,0,0, rva user32_name, rva user32_thunks
  331.         dd      0,0,0, rva gdi32_name, rva gdi32_thunks
  332.         dd      0,0,0,0,0
  333. kernel32_name   db      'kernel32.dll',0
  334. user32_name     db      'user32.dll',0
  335. gdi32_name      db      'gdi32.dll',0
  336. kernel32_thunks:
  337. GetLogicalDrives        dd      rva GetLogicalDrives_thunk
  338. GetDriveTypeA           dd      rva GetDriveTypeA_thunk
  339. CreateFileA             dd      rva CreateFileA_thunk
  340. ReadFile                dd      rva ReadFile_thunk
  341. WriteFile               dd      rva WriteFile_thunk
  342. SetFilePointer          dd      rva SetFilePointer_thunk
  343. CloseHandle             dd      rva CloseHandle_thunk
  344. DeviceIoControl         dd      rva DeviceIoControl_thunk
  345.         dw      0
  346. thunk GetLogicalDrives
  347. thunk GetDriveTypeA
  348. thunk CreateFileA
  349. thunk ReadFile
  350. thunk WriteFile
  351. thunk SetFilePointer
  352. thunk CloseHandle
  353. thunk DeviceIoControl
  354. user32_thunks:
  355. CreateWindowExA         dd      rva CreateWindowExA_thunk
  356. GetMessageA             dd      rva GetMessageA_thunk
  357. TranslateMessage        dd      rva TranslateMessage_thunk
  358. DispatchMessageA        dd      rva DispatchMessageA_thunk
  359. PostQuitMessage         dd      rva PostQuitMessage_thunk
  360. CallWindowProcA         dd      rva CallWindowProcA_thunk
  361. SetWindowLongA          dd      rva SetWindowLongA_thunk
  362. SendMessageA            dd      rva SendMessageA_thunk
  363. MessageBoxA             dd      rva MessageBoxA_thunk
  364.         dw      0
  365. thunk CreateWindowExA
  366. thunk GetMessageA
  367. thunk TranslateMessage
  368. thunk DispatchMessageA
  369. thunk PostQuitMessage
  370. thunk CallWindowProcA
  371. thunk SetWindowLongA
  372. thunk SendMessageA
  373. thunk MessageBoxA
  374. gdi32_thunks:
  375. GetStockObject          dd      rva GetStockObject_thunk
  376.         dw      0
  377. thunk GetStockObject
  378. end data
  379.  
  380. align 4
  381. mbr_new:
  382.         file    'mbr'
  383.  
  384. align 4
  385. OldWndProc      dd      ?
  386. PhysicalDrives  rd      32
  387. sdn             rd      3
  388. n               rb      1024
  389. mbr_dev         rb      512
  390.