![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
name_name |
![]() ![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Привет!
Помогите пожалуйста понять как работать с функциями 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 |
![]()
Сообщение
#2
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Адреса строки и массива.
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Если надо работать непосредственно со строкой (первый параметр), то
invoke GetVolumeInformationW, uni$("D:\"), ...
(макрос uni$ описан в \masm32\macros\ucmacros.asm, если что) |
name_name |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо, ответы помогли.. Но что-то я так и не понял до конца(
Допустим, надо определить файловую систему логического раздела. Вот что у меня выходит
.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 |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата Как исправлять? Правильно пользоваться возможностями 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 |
![]()
Сообщение
#6
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Правильно пользоваться возможностями 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 |
![]()
Сообщение
#7
|
Гость ![]() |
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 |
![]()
Сообщение
#8
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 |
![]() ![]()
Сообщение
#9
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: ![]() ![]() ![]() |
Но я бы хотел еще сам немного помучатся) помучался(Для того что-бы узнать размер тома надо вызывать GetDiskFreeSpaceEx и "оперировать" с предпоследним параметром, верно? Но что-то не выходит( Ведь возвращает он не строку, верно? upd сдается мне что там 64битное число.. и как с ним работать? udp2 StrFormatByteSize64 решает все проблемы Сообщение отредактировано: name_name - 13.12.2009 19:46 |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 2:38 |