Помощь - Поиск - Пользователи - Календарь
Полная версия: win api
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
name_name
Привет!
Помогите пожалуйста понять как работать с функциями win api (особенно интересует. как получит возвращаемое значение).
Например, есть код
WCHAR FSType[512];    

if (GetVolumeInformationW(L"D:\\", NULL, 0, NULL, NULL, NULL, FSType, ARRAYSIZE(FSType))) {
wprintf(L"FS type = %s\n", FSType);
}

если его транслировать на масм32, то получится что-то вроде
invoke GetVolumeInformationW, (???), NULL, 0, NULL, NULL, NULL, ???, 512

но что именно?
Заранее спасибо.
andriano
Адреса строки и массива.
volvo
Если надо работать непосредственно со строкой (первый параметр), то
invoke GetVolumeInformationW, uni$("D:\"), ...
(макрос uni$ описан в \masm32\macros\ucmacros.asm, если что)
name_name
Спасибо, ответы помогли.. Но что-то я так и не понял до конца(
Допустим, надо определить файловую систему логического раздела. Вот что у меня выходит

.486
.model flat, stdcall
option casemap :none

include c:\\masm32\include\windows.inc
include c:\\masm32\macros\macros.asm
include c:\\masm32\macros\ucmacros.asm

include c:\\masm32\include\masm32.inc
include c:\\masm32\include\gdi32.inc
include c:\\masm32\include\user32.inc
include c:\\masm32\include\kernel32.inc

includelib c:\\masm32\lib\masm32.lib
includelib c:\\masm32\lib\gdi32.lib
includelib c:\\masm32\lib\user32.lib
includelib c:\\masm32\lib\kernel32.lib

.data
adr db "D:\", 0
mas db 512 dup(0)

.code
start:
mov eax, 0
invoke GetVolumeInformationW, uni$("D:\"), NULL , 0, NULL, NULL, NULL, offset mas, 2
mov al, mas
mov ebx, 0
test al, 0BH
jz next1
print chr$("FAT32")
jmp end_partition

next1:
test al, 80H
jz next2
print chr$("NTFS")
jmp end_partition

next2:
print chr$("OtherFS")
end_partition:
print chr$(10, 13)


invoke ExitProcess, 0
exit
end start


но оно всегда выводит OtherFS (или я плохо тестил). Как исправлять?
volvo
Цитата
Как исправлять?
Правильно пользоваться возможностями GetVolumeInformationW. Ты зачем последний параметр установил в 2? У тебя вообще-то в mas должно уже записаться название файловой системы...

mas db 512 dup(0)
.code
start:
mov eax, 0
invoke GetVolumeInformationW, uni$("D:\"), NULL, 0, NULL, NULL, NULL, ADDR mas, MAX_PATH
invoke MessageBoxW, NULL, addr mas, uni$("D:\ FS Info"), MB_OK
invoke ExitProcess, 0
exit
end start
name_name
Цитата(volvo @ 13.12.2009 14:09) *

Правильно пользоваться возможностями GetVolumeInformationW. Ты зачем последний параметр установил в 2? У тебя вообще-то в mas должно уже записаться название файловой системы...

mas db 512 dup(0)
.code
start:
mov eax, 0
invoke GetVolumeInformationW, uni$("D:\"), NULL, 0, NULL, NULL, NULL, ADDR mas, MAX_PATH
invoke MessageBoxW, NULL, addr mas, uni$("D:\ FS Info"), MB_OK
invoke ExitProcess, 0
exit
end start


Огромное спасибо! Эти все побитовые операции брал с __msdn.microsoft.com/en-us/library/aa363990%28VS.85%29.aspx . Но все оказалось гораздо проще)


Добавлено через 19 мин.
У меня есть еще вопрос. Как бы теперь это выполнить для всех логических дисков
(аналог(C#)
        DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives){...}

)
?
volvo
sDrive		db "Drive", 0
driveNames db 128 dup(?);

.code
start:
mov eax, 0
invoke GetLogicalDriveStrings, SIZEOF driveNames, ADDR driveNames
lea esi, driveNames

.REPEAT
invoke GetDriveType, esi
.IF EAX == DRIVE_FIXED
invoke MessageBox, NULL, esi, ADDR sDrive, MB_OK
; Ну, а уж тут - делай что тебе надо...
.ENDIF
add esi, 4
.UNTIL byte ptr [esi] == 0
invoke ExitProcess, 0
exit
end start
Смысл программы, которую пишешь, в чем состоит?
name_name
Цитата(volvo @ 13.12.2009 15:31) *

sDrive		db "Drive", 0
driveNames db 128 dup(?);

.code
start:
mov eax, 0
invoke GetLogicalDriveStrings, SIZEOF driveNames, ADDR driveNames
lea esi, driveNames

.REPEAT
invoke GetDriveType, esi
.IF EAX == DRIVE_FIXED
invoke MessageBox, NULL, esi, ADDR sDrive, MB_OK
; Ну, а уж тут - делай что тебе надо...
.ENDIF
add esi, 4
.UNTIL byte ptr [esi] == 0
invoke ExitProcess, 0
exit
end start
Смысл программы, которую пишешь, в чем состоит?

Спасибо! то что надо!
задание звучит так:
Цитата
Написать программу для определения количества логических дисков в системе, типа файловой системы для каждого из дисков, их размера и метки. Отчет о проделанной работе сохранить в текстовый файл.

Но я бы хотел еще сам немного помучатся)
name_name
Цитата(name_name @ 13.12.2009 15:49) *
Но я бы хотел еще сам немного помучатся)
помучался(
Для того что-бы узнать размер тома надо вызывать GetDiskFreeSpaceEx и "оперировать"
с предпоследним параметром, верно? Но что-то не выходит( Ведь возвращает он не строку, верно?

upd
сдается мне что там 64битное число.. и как с ним работать?

udp2
StrFormatByteSize64 решает все проблемы
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.