Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2008, 20:42   #1
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
Печаль проблемы с GetLogicalDriveStrings - Список дисков

Здравствуйте !!!
Чёто немогу сформировать список Дисков, вот код:
Код:
    .data
        szDisplayName db "Hello World",0
	szRemoveDrive	db	"  Съёмный диск",			0
    .data?
		szDrive		DD		?
		hH			DD		?
		szDriveOUT	DD		?
    .code
 
 start:
	;Обращение к API-ф-ции WINDOWS MessageBox для вывода сооищения
			CALL GetProcessHeap
		MOV hH,	EAX
		
		PUSH 255
		PUSH HEAP_ZERO_MEMORY
		PUSH hH
			CALL HeapAlloc
		MOV szDriveOUT,	EAX
		
		PUSH OFFSET szDrive
		PUSH 255
			CALL GetLogicalDriveStrings	
		LEA ESI, szDrive
		N4:
			invoke RtlZeroMemory,addr szDriveOUT,255
			LEA EDI, szDriveOUT
			N3:	
				MOV AL,[ESI]
				MOV [EDI],AL
				INC ESI
				INC EDI
			CMP AL,0
			JNZ N3
				invoke MessageBox,0,addr szDriveOUT,0,0
			MOV AL,[ESI]
		CMP AL,0
		JNZ N4
	ret
end start
Если в кратце- список дисков у меня попадает в стоку szDrive, затем мне надо чтоб каждое название диска попало в строку szDriveOUT, чтобы потом с помощью ф-ции GetDriveType Туда ещё добавить тип диска.
И в итоге вывести в COMBOBOX
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 20.04.2008 в 20:47.
Alexoid вне форума Ответить с цитированием
Старый 20.04.2008, 20:59   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alexoid Посмотреть сообщение
Если в кратце- список дисков у меня попадает в стоку szDrive, затем мне надо чтоб каждое название диска попало в строку szDriveOUT, чтобы потом с помощью ф-ции GetDriveType Туда ещё добавить тип диска.
И в итоге вывести в COMBOBOX
Тоже вкратце. Никакой список никуда не попадает - посмотрите, для какой строки Вы память выделяете, а в какую хотите записать.
B_N вне форума Ответить с цитированием
Старый 20.04.2008, 21:08   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

там проблема не только в этом но в самом алгоритме.
надо примерно вот так:
Код:
 
  invoke RtlZeroMemory,addr szDriveOUT,255   
  lea edi, szDriveOUT   
N3:  
  mov ax, [ESI]   
  cmp ax, 0
  jz N4
  mov AL,[ESI]   
  MOV [EDI],AL   
  INC ESI   
  INC EDI   
  CMP AL,0   
  JNZ N3   
  invoke MessageBox,0,addr szDriveOUT,0,0     
  jmp N3
N4:
rpy3uH вне форума Ответить с цитированием
Старый 20.04.2008, 22:16   #4
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Вот немного подправил - Добавил :
PUSH 255
PUSH HEAP_ZERO_MEMORY
PUSH hH
CALL HeapAlloc
MOV szDrive, EAX
да тут я малость не подумал, меня то збило что некоторые API ф-ции выделяют память сами, записывая туда необходимую инфу, и присваивают указатель переменной- что-то вроде этого. по-моему так поступают с некоторыми параметрами advapi ф-ции по работе с реестром или я опять ошибаюсь?
Результат:
Код:
    .data
        szDisplayName db "Hello World",0
	szRemoveDrive	db	"  Съёмный диск",			0
    .data?
		szDrive		DD		?
		hH			DD		?
		szDriveOUT	DD		?
    .code
 
 start:
	;Обращение к API-ф-ции WINDOWS MessageBox для вывода сооищения
			CALL GetProcessHeap
		MOV hH,	EAX
		
		PUSH 255
		PUSH HEAP_ZERO_MEMORY
		PUSH hH
			CALL HeapAlloc
		MOV szDrive,	EAX
		
		PUSH 255
		PUSH HEAP_ZERO_MEMORY
		PUSH hH
			CALL HeapAlloc
		MOV szDriveOUT,	EAX
				
		PUSH OFFSET szDrive
		PUSH 254
			CALL GetLogicalDriveStrings	
		LEA ESI, szDrive
		N4:
			invoke RtlZeroMemory,addr szDriveOUT,254
			LEA EDI, szDriveOUT
			N3:	
				MOV AL,[ESI]
				MOV [EDI],AL
				INC ESI
				INC EDI
			CMP AL,0
			JNZ N3
			invoke MessageBox,0,addr szDriveOUT,0,0
			MOV AX,[ESI]
		CMP AX,0
		JNZ N4
	ret
end start
Код Грузина не пошёл может не туда подсталял, но насколко я понимаю идея копирования таже, этот вариант у меня вывел 2 диска из 5.
что скажите?
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 20.04.2008 в 22:24.
Alexoid вне форума Ответить с цитированием
Старый 20.04.2008, 22:30   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:
 PUSH OFFSET szDrive
Вам не смещение, а сам szDrive пушать надо. В нём же адрес строки, а не он сам строка.
B_N вне форума Ответить с цитированием
Старый 20.04.2008, 23:16   #6
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Вроде ВСЁ попёрло (изменил ещё осталеное - LEA на MOV поменял). Пасибо-ч-к-и %-)
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом
Alexoid вне форума Ответить с цитированием
Старый 20.04.2008, 23:22   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alexoid Посмотреть сообщение
Вроде ВСЁ попёрло (изменил ещё осталеное - LEA на MOV поменял). Пасибо-ч-к-и %-)
Можно ещё, до кучи, убрать теперь копирование строки и просто вызывать MessageBox для фрагментов первой строки...
B_N вне форума Ответить с цитированием
Старый 21.04.2008, 10:48   #8
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Копирование строки szDrive в szDriveOUT мне необходимо, т.к я хочу ещё с помощью ф-ции GetDriveType к каждому диску добавить описание....
И ещё хотел спросить - после выполнения ф-ции GetLogicalDriveStrings строка szDrive выглядит так: "C:\0D:\0E:\0", где 0 - разделитель, если расчитывать минимальный размер буфера, то получается: в Английском алфавите - 24 буквы, следовательно 24*4=96, так ?
Я незнаю принято ли увас тут просто выкладывать код, вроде как учебных примеров просто думаю, что в целом у меня неплохо получилось(тут и работа со списками и динамическое выдилени памяти и работа со строками - копирование), вот итог:
Код:
    .data
	szNoDrive		db	" - Нет устройства",		0
	szRemoveDrive	db	" - Съёмный диск",			0
	szHardDrive		db	" - Жёсткий диск",			0
	szNetDrive		db	" - Сетевой диск",			0
	szCDDrive		db	" - CD-ROM",				0
	szElectDrive	db	" - Электрнный диск",		0
    ;------------------Other
    INDEX1			DD OFFSET szNoDrive
					DD OFFSET szNoDrive
					DD OFFSET szRemoveDrive
					DD OFFSET szHardDrive
					DD OFFSET szNetDrive
					DD OFFSET szCDDrive
					DD OFFSET szElectDrive
					
    .data?
		szDrive		DD		?
		hH			DD		?
		szDriveOUT	DD		?
    .code
 
 start:
			CALL GetProcessHeap
		MOV hH,	EAX
		
		PUSH 255
		PUSH HEAP_ZERO_MEMORY
		PUSH hH
			CALL HeapAlloc
		MOV szDrive,	EAX
		
		PUSH 255
		PUSH HEAP_ZERO_MEMORY
		PUSH hH
			CALL HeapAlloc
		MOV szDriveOUT,	EAX
				
		PUSH szDrive
		PUSH 254
			CALL GetLogicalDriveStrings	
		MOV ESI, szDrive
		N4:
			invoke RtlZeroMemory,szDriveOUT,254
			MOV EDI, szDriveOUT
			N3:	
				MOV AL,[ESI]
				MOV [EDI],AL
				INC ESI
				INC EDI
			CMP AL,0
			JNZ N3
			PUSH ESI			
			PUSH szDriveOUT
				CALL GetDriveType
			MOV EBX,4
			MUL EBX
			MOV ESI,INDEX1[EAX]
			dec edi
			N5:
				MOV AL,[ESI]
				MOV [EDI],AL
				INC ESI
				INC EDI
			CMP AL,0
			JNZ N5
			invoke MessageBox,0,szDriveOUT,0,0
			POP ESI
			MOV AX,[ESI]
		CMP AX,0
		JNZ N4

		PUSH szDrive
		PUSH 1
		PUSH hH
			CALL HeapFree
		PUSH szDriveOUT
		PUSH 1
		PUSH hH
			CALL HeapFree
	ret
end start
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 21.04.2008 в 13:10.
Alexoid вне форума Ответить с цитированием
Старый 21.04.2008, 12:23   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alexoid Посмотреть сообщение
И ещё хотел спросить - после выполнения ф-ции GetLogicalDriveStrings строка szDrive выглядит так: "C:\0D:\0E:\0", где 0 - разделитель, если расчитывать минимальный размер буфера, то получается: в Английском алфавите - 24 буквы, следовательно 24*4=96, так ?
И ещё один '\0', завершающий всю эту компанию - "c:\<null>d:\<null>m:\<null><null>" . Только в этих расчетах нет никакой нужды - функция сама говорит, какой ей нужен буфер, если данного ей недостаточно - проще говоря, если вызвать её с нулями. Ну а после "нормального" вызова не грех убедиться, что она вернула значение, не большее, чем длина буфера.
http://msdn2.microsoft.com/en-us/lib...75(VS.85).aspx
B_N вне форума Ответить с цитированием
Старый 21.04.2008, 14:06   #10
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Я правелно Вас понял, если её вызвать вот так:
PUSH 0
PUSH 0
CALL GetLogicalDriveStrings
то eax будет содержать число-размер буфера щас попробую.... да фантастика, ещё раз убеждаюсь, что WINAPI - Это СИЛА, с 5-ю дисками он выдал 21, а с 6 -25, что и выходит: 25-1=24(убрал последний ноль) 24/6=4 - каждый диск по 4 байта. Ну это конечно уже решать тому кто прогу делает либо 2 раза вызывать GetLogicalDriveStrings и терять драгоциенные такты процессора, но выделять точное кол-во памяти; либо выделить максимум и прибавить еще 5-6 байтов для уверенности, тем более если размер буфера не такой уж и большой.
До самой истины дошли, тут на этом посте можно Диссертацию накатать покрайней мере основа положена
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 21.04.2008 в 14:41.
Alexoid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Данные-проверка-список (список на другом листе) Inbox Microsoft Office Excel 7 26.12.2008 01:43
Каталогизатор дисков puma Софт 3 28.05.2008 16:05
строка Список логичечких дисков PuzzleC Общие вопросы C/C++ 2 01.11.2007 15:24
Список дисков в DriveComboBox Alar Компоненты Delphi 0 29.10.2006 19:35