Перевод из ассемблера (MASM) в ассемблер (Delphi)

Тема в разделе "WASM.BEGINNERS", создана пользователем Moral_Freak, 26 июн 2008.

  1. Moral_Freak

    Moral_Freak New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2008
    Сообщения:
    9
    Нашёл исходник программы, для работы с сидиромом, писанная на ассемблере (MASM), мне там нужно несколько строчек перевести в дельфийский ассеблер:

    Код (Text):
    1.   ; Закрытие или открытие CD-ROM'а
    2.   mov eax, 4
    3.   mul cdn
    4.   add eax, offset fDrives
    5.   xor edx, edx
    6.   .if [eax] == edx
    7.     inc dword ptr [eax]
    8.     invoke OpenCDDrive
    9.   .else
    10.     dec dword ptr [eax]
    11.     invoke CloseCDDrive
    12.   .endif
    смысл кода в том, что он определяет состояние лотка (открыт/закрыт), в Дельфе это криво определяется (если диска нет - то лоток открыт), я запутался, помогите начинающему.

    Вот исходник:

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. include shell32.inc
    8. include user32.inc
    9. include gdi32.inc
    10. include winmm.inc
    11. include advapi32.inc
    12. include masm32.inc
    13.  
    14. include cdk.mac
    15.  
    16. includelib kernel32.lib
    17. includelib shell32.lib
    18. includelib user32.lib
    19. includelib gdi32.lib
    20. includelib winmm.lib
    21. includelib advapi32.lib
    22. includelib masm32.lib
    23.  
    24. ; #########################################################################
    25. ; Функции инициализации
    26. WinMain proto
    27. MainWindowProc proto :DWORD, :DWORD, :DWORD, :DWORD
    28. CreateMainWindow proto
    29. InitCDDrives proto
    30. AddTrayIcon proto :DWORD
    31. ShowTrayMenu proto :DWORD
    32. DeleteTrayIcons proto
    33. OpenCDDrive proto
    34. CloseCDDrive proto
    35. ExploreCD proto
    36. OpenCDFolder proto
    37. LaunchSystemCDPlayer proto
    38. InstallAutorun proto
    39. CheckAutorun proto
    40. InitTrayMenu proto
    41. AboutCDKProc proto :DWORD, :DWORD, :DWORD, :DWORD
    42. AboutCDK proto
    43. ExecuteDoor proto
    44. SetWaitIcon proto :BOOL
    45. ; #########################################################################
    46. WM_TRAY EQU WM_USER + 100
    47. ; #########################################################################
    48. PUBLIC fAbout
    49. ; #########################################################################
    50. IDM_OPEN     EQU 1001
    51. IDM_CLOSE    EQU 1002
    52. IDM_EXPLORER EQU 1003
    53. IDM_FOLDER   EQU 1004
    54. IDM_SYSPLAY  EQU 1005
    55. IDM_CDPLAY   EQU 1006
    56. IDM_OPTIONS  EQU 1007
    57. IDM_ABOUT    EQU 1008
    58. IDM_EXIT     EQU 1009
    59. IDM_AUTOCDK  EQU 1010
    60. IDM_LETTER   EQU 1011
    61. IDM_WASM     EQU 1012
    62. IDM_UG       EQU 1013
    63. IDM_BIG      EQU 1014
    64. ; #########################################################################
    65.  
    66. .data
    67.  
    68.   szMainClass      db "maincdkclass", 0
    69.   szMainWindow     db "maincdkwindow", 0
    70.   szFmtStr         db "%s", 0
    71.   szFmtCnt         db "%s%s", 0
    72.   szFmtCDDrv       db "CD Drive [%s]", 0
    73.   szcdaudio        db "cdaudio",0
    74.   szOpenDoor       db "set cdaudio door open wait", 0
    75.   szCloseDoor      db "set cdaudio door closed wait", 0  
    76.   szCdkMenu        db "cdkmenu", 0
    77.   szSubKey         db "System\CurrentControlSet\control\MediaResources\mci\cdaudio", 0
    78.   szKey          db "Default Drive", 0
    79.   szExplore        db "explore", 0
    80.   szOpen           db "open", 0
    81.   szCdplay         db "\cdplayer.exe", 0
    82.   szAutoKey        db "Software\Microsoft\Windows\CurrentVersion\Run", 0
    83.   szAutoKeyValue   db "cdk", 0
    84.   szAboutCDKDialog db "AboutCDKDialog", 0
    85.   szLetter         db "mailto:chest@mail.ru", 0
    86.   szWasmSite       db "http://www.wasm.boom.ru", 0
    87.   szBigSite        db "http://www.b-i-g.boom.ru", 0
    88.   szUgSite         db "http://www.guia.nm.ru", 0
    89.  
    90.   drvquan          dd 0
    91.   fDrives          dd 10 dup (0)
    92.  
    93. .data?
    94.  
    95.   hInstance dd ?
    96.   hwnd      dd ?
    97.   szBuf     db MAX_PATH dup(?)
    98.   lpDrives  dd 10 dup (?)
    99.   hKey      dd ?
    100.   bData     dd ?
    101.   cdn       dd ?
    102.   sm        dd ?
    103.   fAbout    db ?
    104.  
    105. .code
    106.  
    107. start:
    108.  
    109.   invoke GetModuleHandle, NULL
    110.   mov hInstance, eax  
    111.   invoke CreateMainWindow
    112.   invoke InitCDDrives
    113.   invoke WinMain
    114.   invoke ExitProcess, 0
    115.  
    116. WinMain proc
    117.   LOCAL msg:MSG
    118.  
    119.   .while TRUE
    120.     invoke GetMessage, addr msg, NULL, 0, 0
    121.     .break.if (!eax)
    122.     invoke TranslateMessage, addr msg
    123.     invoke DispatchMessage, addr msg
    124.   .endw  
    125.  
    126.   ret
    127.  
    128. WinMain endp    
    129. ; #########################################################################
    130. MainWindowProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    131.  
    132.   .if uMsg == WM_CREATE
    133.  
    134.     invoke InitTrayMenu
    135.  
    136.   .elseif uMsg == WM_DESTROY
    137.  
    138.     invoke DeleteTrayIcons
    139.     invoke PostQuitMessage, 0
    140.    
    141.   .elseif uMsg == WM_TRAY
    142.  
    143.     ; Сохранение wParam в глобальную переменную
    144.     mtm cdn, wParam
    145.     .if lParam == WM_RBUTTONDOWN
    146.       invoke ShowTrayMenu, wParam
    147.     .elseif lParam == WM_LBUTTONUP
    148.       invoke ExecuteDoor  
    149.     .endif    
    150.  
    151.   .elseif uMsg == WM_COMMAND
    152.    
    153.     mov eax, wParam  
    154.     .if lParam == 0
    155.       .if ax == IDM_EXIT
    156.         invoke SendMessage, hWnd, WM_DESTROY, 0, 0
    157.       .elseif ax == IDM_OPEN
    158.         invoke OpenCDDrive        
    159.       .elseif ax == IDM_CLOSE
    160.         invoke CloseCDDrive        
    161.       .elseif ax == IDM_EXPLORER
    162.         invoke ExploreCD
    163.       .elseif ax == IDM_FOLDER
    164.         invoke OpenCDFolder
    165.       .elseif ax == IDM_SYSPLAY
    166.         invoke LaunchSystemCDPlayer
    167.       .elseif ax == IDM_AUTOCDK
    168.         invoke InstallAutorun  
    169.       .elseif ax == IDM_ABOUT
    170.         invoke AboutCDK
    171.       .elseif ax == IDM_LETTER
    172.         invoke ShellExecute, hwnd, addr szOpen, addr szLetter, NULL, NULL, 0
    173.       .elseif ax == IDM_WASM
    174.         invoke ShellExecute, hwnd, addr szOpen, addr szWasmSite, NULL, NULL, 0
    175.       .elseif ax == IDM_BIG        
    176.         invoke ShellExecute, hwnd, addr szOpen, addr szBigSite, NULL, NULL, 0
    177.       .elseif ax == IDM_UG        
    178.         invoke ShellExecute, hwnd, addr szOpen, addr szUgSite, NULL, NULL, 0
    179.       .endif    
    180.     .endif
    181.  
    182.   .else
    183.  
    184.     invoke DefWindowProc, hWnd, uMsg, wParam, lParam
    185.     ret
    186.  
    187.   .endif
    188.  
    189.   xor eax, eax  
    190.   ret
    191.  
    192. MainWindowProc endp
    193. ; #########################################################################
    194. CreateMainWindow proc
    195.   LOCAL wc:WNDCLASS
    196.  
    197.   mtm wc.style, CS_HREDRAW + CS_VREDRAW
    198.   mtm wc.lpfnWndProc, offset MainWindowProc
    199.   mov wc.cbClsExtra, 0
    200.   mov wc.cbWndExtra, 0
    201.   mtm wc.hInstance, hInstance
    202.   invoke LoadIcon, NULL, IDI_APPLICATION
    203.   mov wc.hIcon, eax
    204.   invoke LoadCursor, NULL, IDC_ARROW
    205.   mov wc.hCursor, eax
    206.   mov wc.hbrBackground, COLOR_WINDOW
    207.   mov wc.lpszMenuName, NULL
    208.   mov wc.lpszClassName, offset szMainClass
    209.   invoke RegisterClass, addr wc
    210.  
    211.   invoke CreateWindowEx, NULL, addr szMainClass, addr szMainWindow, WS_POPUP, \
    212.          0, 0, 0, 0, NULL, NULL, hInstance, NULL
    213.   mov hwnd, eax        
    214.          
    215.  
    216.   ret
    217.  
    218. CreateMainWindow endp
    219. ; #########################################################################
    220. InitCDDrives proc uses ebx esi
    221.  
    222.   ; Получаем строку, содержащую все логические диски
    223.   invoke GetLogicalDriveStrings, MAX_PATH, addr szBuf
    224.   ; Анализируем полученную строку
    225.   mov ebx, offset szBuf
    226.   .repeat
    227.     invoke GetDriveType, ebx
    228.     .if eax == DRIVE_CDROM
    229.       new 5
    230.       mov esi, eax
    231.       mov eax, 4
    232.       mul drvquan
    233.       add eax, offset lpDrives
    234.       mov [eax], esi
    235.       invoke CharUpper, ebx
    236.       invoke wsprintf, esi, addr szFmtStr, ebx
    237.       invoke wsprintf, addr szBuf, addr szFmtStr, ebx
    238.       mov eax, offset szBuf
    239.       add eax, 2
    240.       xor edx, edx
    241.       mov [eax], edx
    242.       invoke AddTrayIcon, addr szBuf
    243.       inc drvquan  
    244.     .endif    
    245.     add ebx, 4
    246.   .until byte ptr [ebx+1] == 0
    247.  
    248.   ret
    249.  
    250. InitCDDrives endp
    251. ; #########################################################################
    252. AddTrayIcon proc uses ebx lpszDrvPath
    253.   LOCAL nd:NOTIFYICONDATA
    254.  
    255.   ; Инициализация данных
    256.   mov nd.cbSize, sizeof NOTIFYICONDATA
    257.   mtm nd.hwnd, hwnd
    258.   mov ebx, drvquan
    259.   mtm nd.uID, ebx
    260.   mov nd.uCallbackMessage, WM_TRAY
    261.   invoke LoadIcon, hInstance, 2001
    262.   push eax
    263.   pop nd.hIcon
    264.   invoke wsprintf, addr nd.szTip, addr szFmtCDDrv, lpszDrvPath
    265.   mov nd.uFlags, NIF_ICON + NIF_MESSAGE + NIF_TIP
    266.   ; Добавление иконки
    267.   invoke Shell_NotifyIcon, NIM_ADD, addr nd
    268.  
    269.   ret
    270.  
    271. AddTrayIcon endp
    272. ; #########################################################################
    273. ShowTrayMenu proc dcd:DWORD
    274.  
    275.   LOCAL pt:POINT
    276.  
    277.   ; Установка текущего CD-ROM'а
    278.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szSubKey, 0, KEY_WRITE, addr hKey  
    279.   invoke RegSetValueEx, hKey, addr szKey, 0, REG_BINARY, addr dcd, sizeof dcd
    280.   invoke RegCloseKey, hKey
    281.   ; Получение необходимых хэндлов
    282.   invoke GetCursorPos, addr pt
    283.   invoke SetForegroundWindow, hwnd
    284.   ; Установление свойств меню
    285.   invoke CheckAutorun
    286.   .if !eax
    287.     invoke CheckMenuItem, sm, IDM_AUTOCDK, MF_BYCOMMAND + MF_CHECKED
    288.   .else
    289.     invoke CheckMenuItem, sm, IDM_AUTOCDK, MF_BYCOMMAND + MF_UNCHECKED    
    290.   .endif
    291.   mov eax, 4
    292.   mul cdn
    293.   add eax, offset lpDrives  
    294.   invoke GetVolumeInformation, [eax], NULL, NULL, NULL, NULL, NULL, NULL, NULL  
    295.   .if !eax    
    296.     invoke EnableMenuItem, sm, IDM_EXPLORER, MF_BYCOMMAND + MF_GRAYED
    297.     invoke EnableMenuItem, sm, IDM_FOLDER, MF_BYCOMMAND + MF_GRAYED
    298.   .else    
    299.     invoke EnableMenuItem, sm, IDM_EXPLORER, MF_BYCOMMAND + MF_ENABLED
    300.     invoke EnableMenuItem, sm, IDM_FOLDER, MF_BYCOMMAND + MF_ENABLED
    301.   .endif
    302.   ; Отображение меню
    303.   invoke TrackPopupMenu, sm, TPM_RIGHTALIGN, pt.x, pt.y, NULL, hwnd, NULL
    304.   invoke PostMessage,hwnd,WM_NULL,0,0
    305.  
    306.   ret
    307.  
    308. ShowTrayMenu endp
    309. ; #########################################################################
    310. DeleteTrayIcons proc uses ebx
    311.   LOCAL nd:NOTIFYICONDATA
    312.  
    313.   ; Начальная инициализация nd
    314.   mov nd.cbSize, sizeof NOTIFYICONDATA
    315.   mtm nd.hwnd, hwnd
    316.   ; Цикл удаления иконок
    317.   xor ebx, ebx
    318.   .while ebx < drvquan
    319.     mov nd.uID, ebx
    320.     invoke Shell_NotifyIcon, NIM_DELETE, addr nd
    321.     inc ebx
    322.   .endw
    323.  
    324.   ret
    325.  
    326. DeleteTrayIcons endp
    327. ; #########################################################################
    328. OpenCDDrive proc
    329.  
    330.   ; Увеличиваем флаг на один
    331.   mov eax, 4
    332.   mul cdn
    333.   add eax, offset fDrives
    334.   mov dword ptr [eax], 1
    335.   ; Открываем устройство, открываем дверцу, закрываем устройство
    336.   invoke SetWaitIcon, TRUE
    337.   invoke mciSendString, addr szOpenDoor, 0, 0, hwnd
    338.   invoke SetWaitIcon, FALSE
    339.  
    340.   ret
    341.  
    342. OpenCDDrive endp  
    343. ; #########################################################################
    344. CloseCDDrive proc
    345.  
    346.   ; Уменьшаем флаг на один
    347.   mov eax, 4
    348.   mul cdn
    349.   add eax, offset fDrives
    350.   mov dword ptr [eax], 0
    351.   ; Открываем устройство, открываем дверцу, закрываем устройство
    352.   invoke SetWaitIcon, TRUE
    353.   invoke mciSendString, addr szCloseDoor, 0, 0, hwnd
    354.   invoke SetWaitIcon, FALSE
    355.  
    356.   ret
    357.  
    358. CloseCDDrive endp  
    359. ; #########################################################################
    360. ExploreCD proc
    361.  
    362.   mov eax, 4
    363.   mul cdn
    364.   add eax, offset lpDrives
    365.   invoke ShellExecute, NULL, addr szExplore, [eax], NULL, NULL, SW_SHOW
    366.  
    367.   ret
    368.  
    369. ExploreCD endp
    370. ; #########################################################################
    371. OpenCDFolder proc
    372.  
    373.   mov eax, 4
    374.   mul cdn
    375.   add eax, offset lpDrives
    376.   invoke ShellExecute, NULL, addr szOpen, [eax], NULL, NULL, SW_SHOW
    377.  
    378.   ret
    379.  
    380. OpenCDFolder endp
    381. ; #########################################################################
    382. LaunchSystemCDPlayer proc
    383.  
    384.   invoke GetWindowsDirectory, addr szBuf, MAX_PATH
    385.   invoke wsprintf, addr szBuf, addr szFmtCnt, addr szBuf, addr szCdplay
    386.   invoke ShellExecute, NULL, addr szOpen, addr szBuf, NULL, NULL, SW_SHOW
    387.  
    388.   ret
    389.  
    390. LaunchSystemCDPlayer endp
    391. ; #########################################################################
    392. InstallAutorun proc
    393.   LOCAL mi:MENUITEMINFO
    394.  
    395.   invoke GetMenuState, sm, IDM_AUTOCDK, MF_BYCOMMAND
    396.   .if eax == MF_UNCHECKED
    397.     invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szAutoKey, 0, KEY_WRITE, addr hKey
    398.     invoke GetModuleFileName, hInstance, addr szBuf, MAX_PATH
    399.     invoke lstrlen, addr szBuf
    400.     invoke RegSetValueEx, hKey, addr szAutoKeyValue, 0, REG_SZ, addr szBuf, eax
    401.     invoke RegCloseKey, hKey  
    402.   .elseif eax == MF_CHECKED
    403.     invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szAutoKey, 0, KEY_WRITE, addr hKey   
    404.     invoke RegDeleteValue, hKey, addr szAutoKeyValue
    405.     invoke RegCloseKey, hKey
    406.   .endif
    407.  
    408.   ret
    409.  
    410. InstallAutorun endp
    411. ; #########################################################################
    412. CheckAutorun proc
    413.   LOCAL rv:DWORD
    414.   LOCAL bsize:DWORD
    415.  
    416.   mov bsize, MAX_PATH
    417.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szAutoKey, 0, KEY_READ, addr hKey
    418.   invoke RegQueryValueEx, hKey, addr szAutoKeyValue, 0, addr rv, addr szBuf, addr bsize
    419.   push eax
    420.   invoke RegCloseKey, hKey
    421.   pop eax
    422.  
    423.   ret
    424.  
    425. CheckAutorun endp
    426. ; #########################################################################
    427. InitTrayMenu proc
    428.  
    429.   ; Получаем хэндл меню
    430.   invoke LoadMenu, hInstance, addr szCdkMenu
    431.   invoke GetSubMenu, eax, 0
    432.   mov sm, eax
    433.   ; Добавляем иконки
    434.   invoke LoadBitmap, hInstance, 2002
    435.   invoke SetMenuItemBitmaps, sm, IDM_OPEN, MF_BYCOMMAND, eax, eax
    436.   invoke LoadBitmap, hInstance, 2003
    437.   invoke SetMenuItemBitmaps, sm, IDM_CLOSE, MF_BYCOMMAND, eax, eax
    438.   invoke LoadBitmap, hInstance, 2004
    439.   invoke SetMenuItemBitmaps, sm, IDM_EXPLORER, MF_BYCOMMAND, eax, eax
    440.   invoke LoadBitmap, hInstance, 2005
    441.   invoke SetMenuItemBitmaps, sm, IDM_FOLDER, MF_BYCOMMAND, eax, eax
    442.   invoke LoadBitmap, hInstance, 2006
    443.   invoke SetMenuItemBitmaps, sm, IDM_SYSPLAY, MF_BYCOMMAND, eax, eax
    444.   invoke LoadBitmap, hInstance, 2007
    445.   invoke SetMenuItemBitmaps, sm, IDM_ABOUT, MF_BYCOMMAND, eax, eax
    446.   invoke LoadBitmap, hInstance, 2008
    447.   invoke SetMenuItemBitmaps, sm, IDM_EXIT, MF_BYCOMMAND, eax, eax
    448.   invoke LoadBitmap, hInstance, 2009
    449.   invoke SetMenuItemBitmaps, sm, IDM_LETTER, MF_BYCOMMAND, eax, eax
    450.  
    451.   ret
    452.  
    453. InitTrayMenu endp
    454. ; #########################################################################
    455. AboutCDK proc
    456.  
    457.   .if fAbout
    458.     ret
    459.   .endif
    460.   inc fAbout
    461.   invoke DialogBoxParam, hInstance, addr szAboutCDKDialog, hwnd, addr AboutCDKProc, NULL
    462.  
    463.   ret
    464.  
    465. AboutCDK endp
    466. ; #########################################################################
    467. ExecuteDoor proc
    468.  
    469.   ; Установка текущего CD-ROM'а
    470.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szSubKey, 0, KEY_WRITE, addr hKey  
    471.   invoke RegSetValueEx, hKey, addr szKey, 0, REG_BINARY, addr cdn, sizeof cdn
    472.   invoke RegCloseKey, hKey
    473.   ; Закрытие или открытие CD-ROM'а
    474.   mov eax, 4
    475.   mul cdn
    476.   add eax, offset fDrives
    477.   xor edx, edx
    478.   .if [eax] == edx
    479.     inc dword ptr [eax]
    480.     invoke OpenCDDrive
    481.   .else
    482.     dec dword ptr [eax]
    483.     invoke CloseCDDrive
    484.   .endif
    485.  
    486.  
    487.   ret
    488.  
    489. ExecuteDoor endp
    490. ; #########################################################################
    491. SetWaitIcon proc fIcon:BOOL
    492.   LOCAL nd:NOTIFYICONDATA
    493.  
    494.   ; Инициализация данных
    495.   mov nd.cbSize, sizeof NOTIFYICONDATA
    496.   mtm nd.hwnd, hwnd
    497.   mov ebx, drvquan
    498.   mtm nd.uID, cdn
    499.   mov nd.uFlags, NIF_ICON
    500.   .if fIcon
    501.     invoke LoadIcon, hInstance, 2000
    502.     mov nd.hIcon, eax
    503.   .else
    504.     invoke LoadIcon, hInstance, 2001
    505.     mov nd.hIcon, eax  
    506.   .endif
    507.   ; Установка иконки
    508.   invoke Shell_NotifyIcon, NIM_MODIFY, addr nd
    509.  
    510.   ret
    511.  
    512. SetWaitIcon endp
    513. ; #########################################################################
    514.  
    515. end start
    С уважением.
     
  2. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Moral_Freak

    Тебе не ассемблерный код нужен. Используй только API.
    Код (Text):
    1. mciSendString("set cdaudio door open wait", 0, 0, [идентификатор окна приложения]) - для открытия лотка
    2. mciSendString(set cdaudio door closed wait, 0, 0, [идентификатор окна приложения]) - для закрытия лотка
    И где-нибудь сохраняй флаг текущего состояния лотка (открыт/закрыт).
     
  3. Moral_Freak

    Moral_Freak New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2008
    Сообщения:
    9
    Нет, нет открывать лотки и закрывать лотки я умею. Я не могу в Делфи корректно определить состояние лотка, т.е. драйвер делает это криво, если сидюк закрыт и диска там нету - то он считает что лоток открыт!
    Моя программа не висит в процессах, она запускается, выполняет действие и закрывается, можно конечно сохранять в глобальных атомах, НО после перезагрузки они ведь подчищаются.
    Автор программы решил эту проблему 4 строчками, помогите это перегнать в Делфи.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Moral_Freak
    Если и решил, то не 4-мя строчками. Во всем коде разьбираться лень, но приведенный тобой кусок кода на пскале выглядит просто:
    Код (Text):
    1. var
    2.   fDrives:array[0..9] of integer; //флаги состояния дисководов, 1 - открыт, 0 - закрыт
    3.   cdn:integer;  //номер дисковода
    4. procedure ExecuteDor;
    5. begin
    6.    //.. запись cdn в реестр
    7.    if fDrives[cdn] = 0 then
    8.       OpenCDDrive //устанавливает fDrives[cdn]:=1;
    9.    else
    10.       CloseCDDrive;  //устанавливает fDrives[cdn]:=0;
    11. end;
    Т.е. просто при каждом открытии\закрытии устанавливает\сбрасывает флаг fDrives[cdn]. Причем элементарный поиск строки показывает, что fDrives нигде больше в коде не используется, т.е. никак специально не инициализируется и значит по умолчанию предполагается, что при запуске проги дисковод закрыт

    PS: И индексация массива кстати реализована дебильно через mul, вместо стандартной
    Код (Text):
    1. mov eax,cdn
    2. lea eax,[eax*4+offset fDrives]
     
  5. Moral_Freak

    Moral_Freak New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2008
    Сообщения:
    9
    Значит всё-таки вот так:
    Код (Text):
    1. И где-нибудь сохраняй флаг текущего состояния лотка (открыт/закрыт).
    А вообще на низкоуровневом программировани, как определить состояние лотка сидирома?
     
  6. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Moral_Freak
    Код (Text):
    1. А вообще на низкоуровневом программировани, как определить состояние лотка сидирома?
    У меня не получилось. Может драйвер оборудования может это делать. Но врядли это будет универсальное решение.
     
  7. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Moral_Freak

    Хотя, знаешь ли, кажется есть возможность http://expert.delphi.int.ru/question/1550/

    Опять же API.
    Код (Text):
    1. mciSendString("status cdaudio mode", lpstrBuffer, uLength, [идентификатор окна приложения])
    где: lpstrBuffer - строковый буфер. Если лоток привода открыт, в буфере будет находиться строка "open". Если лоток привода закрыт, но диска в нем нет, в буфере будет находиться строка "open". Если лоток привода закрыт и вставлен диск, в буфере будет находиться строка "stopped".
    uLength - длина строкового буфера

    А вообще свойство "mode" может возвращать значения "not ready", "paused", "playing" и "stopped". Некоторые девайсы дополнительно могут возвращать значения "open", "parked", "recording" и "seeking".