IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> win api, работа с винапи и файловой системой
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Привет!
Помогите пожалуйста понять как работать с функциями 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

но что именно?
Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Адреса строки и массива.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Если надо работать непосредственно со строкой (первый параметр), то
invoke GetVolumeInformationW, uni$("D:\"), ...
(макрос uni$ описан в \masm32\macros\ucmacros.asm, если что)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Спасибо, ответы помогли.. Но что-то я так и не понял до конца(
Допустим, надо определить файловую систему логического раздела. Вот что у меня выходит

.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 (или я плохо тестил). Как исправлять?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Цитата(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){...}

)
?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
Смысл программы, которую пишешь, в чем состоит?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Цитата(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
Смысл программы, которую пишешь, в чем состоит?

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

Но я бы хотел еще сам немного помучатся)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


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

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

udp2
StrFormatByteSize64 решает все проблемы

Сообщение отредактировано: name_name -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.10.2020 19:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name