Всем привет. На асме кодил лет 8 назад последний раз. С виндовыми API соответственно знаком плохо. Но думаю если толкнете в нужном направлении, то разберусь. Стоит такая задача: Необходимо средствами виндовых API (в asm-е) правильно определить USB устройство (его код или букву устройства) затем форматнуть его и залить на него некий файл.
Что значит определить? У устройства есть имя, формируемое из VID и PID производителя. Узнать его можно через Setup API. В хелпе Win32 SDK этого нет. Смотреть нужно в MSDN. Сейчас не могу сказать конкретно, потому что вчера пил холодную водку и понятное дело "простудился", а завтра дам кусок исходника, который получает имя устройства и далее работает с ним как файлом.
мерси! буду очень ждать пробовал накорябать через такую функцию: Код (Text): mov ah,48h int 13h Код (Text): вот описание: NT 13 - IBM/MS INT 13 Extensions - GET DRIVE PARAMETERS AH = 48h DL = drive (80h-FFh) DS:SI -> buffer for drive parameters (see #00273) Return: CF clear if successful AH = 00h DS:SI buffer filled CF set on error AH = error code (see #00234) BUGS: several different Compaq BIOSes incorrectly report high-numbered drives (such as 90h, B0h, D0h, and F0h) as present, giving them the same geometry as drive 80h; as a workaround, scan through disk numbers, stopping as soon as the number of valid drives encountered equals the value in 0040h:0075h Dell machines using PhoenixBIOS 4.0 Release 6.0 fail to correctly handle this function if the flag word at DS:[SI+2] is not 0000h on entry SeeAlso: AH=08h,AH=41h,AH=49h,MEM 0040h:0075h Format of IBM/MS INT 13 Extensions drive parameters: Offset Size Description (Table 00273) 00h WORD (call) size of buffer (001Ah for v1.x, 001Eh for v2.x, 42h for v3.0) (ret) size of returned data 02h WORD information flags (see #00274) 04h DWORD number of physical cylinders on drive 08h DWORD number of physical heads on drive 0Ch DWORD number of physical sectors per track 10h QWORD total number of sectors on drive 18h WORD bytes per sector ---v2.0+ --- 1Ah DWORD -> EDD configuration parameters (see #00278) FFFFh:FFFFh if not available ---v3.0 --- 1Eh WORD signature BEDDh to indicate presence of Device Path info 20h BYTE length of Device Path information, including signature and this byte (24h for v3.0) 21h 3 BYTEs reserved (0) 24h 4 BYTEs ASCIZ name of host bus ("ISA" or "PCI") 28h 8 BYTEs ASCIZ name of interface type "ATA" "ATAPI" "SCSI" [b]"<span class='searchlite'>USB</span>"[/b] "1394" IEEE 1394 (FireWire) "FIBRE" Fibre Channel 30h 8 BYTEs Interface Path (see #00275) 38h 8 BYTEs Device Path (see #00276) 40h BYTE reserved (0) 41h BYTE checksum of bytes 1Eh-40h (two's complement of sum, which makes the 8-bit sum of bytes 1Eh-41h equal 00h) Note: if the size is less than 30 on call, the final DWORD will not be returned by a v2.x implementation; similarly for the Device Path info SeeAlso: #00277,#03196 он у меня ломается, с ошибкой "01", что такой функции нет.
mutate во первых, винда такова не потерпит (int13h, вызванный в коде win32 приложения), что касается дос или его эмуляции, то ... в голом досе это должно работать, если биос поддерживает расширенный сервис int13h, если в эмуляции, то кто вам сказал, что ntvdm подсистема позволит на ура работать с int13h ???
я усе понял.. выкрутился таким вызовом: Код (Text): .data slpRootPathName db "A:\",0 .code ...... invoke GetDriveType, offset slpRootPathName mov dword ptr hDrive,eax ..... т.е. DRIVE_REMOVABLE я нахожу легко. подскажите как одной комндой его форматнуть или снести все файлы с подкаталогами, причем должно работать от win98 до XP? такую химеру не предлагать: command.com /C echo Y | format.com U: /v:AnyLabel т.к. бывает диск открыт,тогда так ругнется: ALL OPENED HANDLES TO THIS VOLUME WOULD THEN BE INVALID. Would you like to force a dismount on this volume? (Y/N) Cannot lock the drive. The volume is still in use. (не хочу возиться с FirstFile -> NextFile - DeleteFile) т.е. что-то типа: HANDLE WINAPI OpenPartition( HANDLE hStore, LPCTSTR szPartitionName ); BOOL WINAPI FormatPartition( HANDLE hPartition ); только это все для winCE и .NET =(