Подобный код совместимый с Windows

Тема в разделе "WASM.BEGINNERS", создана пользователем Win32Api, 30 ноя 2023.

  1. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Недавно наткнулся на один старый исходник под dos для поиска файлов.

    Код (Text):
    1.  
    2. const
    3.   faReadOnly  = $01;
    4.   faHidden    = $02;
    5.   faSystem    = $04;
    6.   faVolumeID  = $08;
    7.   faDirectory = $10;
    8.   faArchive   = $20;
    9.   faAnyFile   = $3F;
    10.  
    11. type
    12.   PSearchRec = ^TSearchRec;
    13.   TSearchRec = record
    14.     Drive      : Char;
    15.     Name8      : array[1..8] of Char;
    16.     Ext3       : array[1..3] of Char;
    17.     SearchAttr : Byte;
    18.     Num        : Word;
    19.     Cluster    : Word;
    20.     Unused     : array[1..4] of byte;
    21.     Attr       : Byte;
    22.     Time       : Word;
    23.     Date       : Word;
    24.     Size       : Longint;
    25.     Name       : array[1..12] of Char;
    26.   end;
    27.  
    28. procedure FindFirst(Dta: PSearchRec; Attr: Byte; Files: PChar); assembler;
    29.   asm
    30.     PUSH DS
    31.  
    32.     MOV AH, 2FH
    33.     INT 21H
    34.     PUSH ES
    35.     PUSH BX
    36.  
    37.     MOV AH, 1AH
    38.     LDS DX, Dta
    39.     INT 21H
    40.  
    41.     MOV AH, 4EH
    42.     LDS DX, Files
    43.     XOR CH, CH
    44.     MOV CL, Attr
    45.     INT 21H
    46.  
    47.     MOV AH, 1AH
    48.     POP DX
    49.     POP DS
    50.     INT 21H
    51.  
    52.     POP DS
    53.   end;
    54.  
    55. procedure FindNext(Dta : PSearchRec); assembler;
    56.   asm
    57.     PUSH DS
    58.  
    59.     MOV AH, 2FH
    60.     INT 21H
    61.     PUSH ES
    62.     PUSH BX
    63.  
    64.     MOV AH, 1AH
    65.     LDS DX, Dta
    66.     INT 21H
    67.  
    68.     MOV AH, 4FH
    69.     INT 21H
    70.  
    71.     MOV AH, 1AH
    72.     POP DX
    73.     POP DS
    74.     INT 21H
    75.  
    76.     POP DS
    77.   end;
    78.  
    Существует ли подобное решение под windows, _без_ использования FindFirstFile/FindNextFile?
     
    Последнее редактирование: 30 ноя 2023
  2. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    462
    Всмысле есть ли на Windows DOS API? Нет, нету.
    Для DOS int 21h + ah=3Fh это и есть FindFirst. Причём есть еще ah=11h - старый стиль DOS 1.0 через FCB.
     
    Win32Api нравится это.
  3. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Понятно, спасибо :)
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Смотря что считать подобным. Через прерывания нельзя, но место прерываний заняли системные вызовы - sysenter на x32 и syscall на x64, которые работают по похожему принципу: кладём номер обработчика в регистр и вызываем sysenter/syscall.
    На современных системах примерно то же самое можно сделать через прямой сисколл NtQueryDirectoryFile (только надо помнить, что номера сисколлов могут меняться с любым обновлением системы).
    Типа такого:
    Код (ASM):
    1.  
    2.     mov rcx, hDirectory
    3.     mov rdx, 0  ; Event
    4.     mov r8, 0  ; ApcRoutine
    5.     ...  ; Другие аргументы в r9 и через стек
    6.     mov r10, rcx
    7.     mov eax, 0x35  ; Номер NtQueryDirectoryFile в таблице системных вызовов на Win11 10.0.22000
    8.     syscall  ; Уходим в ядро
    9.     ret
    10.  
    На процессорах, где инструкция syscall не поддерживается, можно ходить в ядро через int 2Eh.
     
    Последнее редактирование: 30 ноя 2023
  5. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Значит это сложнее чем я думал.
    Будем юзать старую добрую FindFirstFile.

    Спасибо за ответ :)
    --- Сообщение объединено, 30 ноя 2023 ---
    Что-то типа такого:
    Код (Text):
    1. .data
    2. szSlesh db "\",0,0,0
    3. szLink db "\??\C:\",0
    4. .code
    5. align 4
    6. ZwSearch proc uses esi lpPath:dword,lpPathLen:dword
    7.      local hFind:HANDLE
    8.      local iosb:IO_STATUS_BLOCK
    9.    
    10.        invoke ZwOpenFile,addr hFind,100001h,lpPath,addr iosb,7,21h
    11.         .if eax == 0 && iosb.Information == 1
    12.            invoke GlobalAlloc,40h,260
    13.            mov esi,eax
    14.            lea ecx,iosb
    15.            xor eax,eax
    16.            invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,1
    17.             .while eax != 80000006h
    18.                or eax,eax
    19.                jnz @F
    20.                lea eax,[esi+040h] ;FileName
    21.                mov ecx,dword ptr [esi+03Ch] ;FileNameLength
    22.                mov byte ptr [eax+ecx],0
    23.                cmp word ptr [eax],'.'
    24.                jz s_next
    25.                cmp word ptr [eax+2],'.'
    26.                jz s_next
    27.                mov ebx,lpPath
    28.                mov ebx,dword ptr [ebx+000000008h] ;ObjectName
    29.                mov edi,dword ptr [ebx+4] ;Buffer
    30.                mov ecx,lpPathLen
    31.                mov byte ptr [edi+ecx],0
    32.                add edi,ecx
    33.                push esi
    34.                push ecx
    35.                lea esi,[esi+040h]
    36.                rep movsb
    37.                pop ecx
    38.                pop esi
    39.  
    40.                test dword ptr [esi+38h],10h ;FileAttributes
    41.                jz s_file
    42.              
    43.                add ecx,dword ptr [esi+03Ch] ;FileNameLength
    44.                mov edi,dword ptr [ebx+4] ;Buffer
    45.                add edi,ecx
    46.              
    47.                push esi
    48.                push ecx
    49.                mov esi,offset szSlesh
    50.                rep movsb
    51.                pop ecx
    52.                pop esi
    53.                add ecx,2
    54.                mov word ptr [ebx],cx ;Length
    55.                   pusha
    56.                   lea eax,[esi+040h] ;FileName
    57.                   invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    58.                   popa
    59.                
    60.                invoke ZwSearch,lpPath,ecx
    61.                jmp s_next
    62.         s_file:
    63.                   pusha
    64.                   lea eax,[esi+040h] ;FileName
    65.                   invoke MessageBoxW,0,eax,dword ptr [ebx+4],0
    66.                   popa
    67.                
    68.         s_next:
    69.                lea ecx,iosb
    70.                xor eax,eax
    71.                invoke ZwQueryDirectoryFile,hFind,eax,eax,eax,ecx,esi,260,1,1,eax,eax
    72.             .endw
    73.         @@:
    74.            invoke GlobalFree,esi
    75.            invoke ZwClose,hFind
    76.         .endif
    77.        ret
    78. ZwSearch endp
    79. start proc
    80.      local as:ANSI_STRING
    81.      local us:UNICODE_STRING
    82.      local oa:OBJECT_ATTRIBUTES
    83.        invoke lstrlen,offset szLink
    84.        mov as._Length,ax
    85.        mov as.MaximumLength,ax
    86.        mov eax,offset szLink
    87.        mov as.Buffer,eax
    88.        invoke RtlAnsiStringToUnicodeString,addr us,addr as,1
    89.        invoke RtlInitUnicodeString,addr us,us.Buffer
    90.      
    91.        xor eax,eax
    92.        lea ecx,oa
    93.        mov dword ptr [ecx],000000018h
    94.        and dword ptr [ecx+000000004h],eax
    95.        mov dword ptr [ecx+00000000Ch],00000240h
    96.        and dword ptr [ecx+000000010h],eax
    97.        lea ebx,us
    98.        mov dword ptr [ecx+000000008h],ebx
    99.        and dword ptr [ecx+000000014h],eax
    100.      
    101.        movzx ecx,us._Length
    102.        invoke ZwSearch,addr oa,ecx
    103.        invoke ExitProcess,0
    104. start endp
    Слишком много полей, и непонятки с Unicode. Зато быстрее на 30%-40% :)
    --- Сообщение объединено, 30 ноя 2023 ---
    Пацан к успеху шел, не получилось, не фортануло
     
  6. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    быстрее чего?
     
  7. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    FindFirstFile/FindNextFile, судя по инфе из интернета
     
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    а где тайминг
    или ет на глазок
     
  9. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    А тебе зачем?
     
  10. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    чтоб развеять когнитом ложи...
     
  11. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    В целях самопознания штоле?
     
  12. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    В целях того что скорее всего это ложь, больше всего сисколы забирают а не обвертки
     
  13. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Я не в курсе ложь это или нет, это инфа с интернета на которую наткнулся, когда гуглил за ZwQueryDirectoryFile

     
    Последнее редактирование: 1 дек 2023