Всем привет! У меня тут маленький вопрос. Надо прога, которая считала бы сколько всего байт на жестком диске. Под windows Вот только на низкоуровневом языке у меня это не получается. Вроде в Windows XP защита стоит. Или нет? Вобщем вопрос как это можно сделать на ассемблере? Спасибо.
Если ты хочешь сам узнать, сколько места на диске: 1) Пиши драйвер. В драйвере ты можешь написать на ассемблере все что угодно. 2) Если хочешь полегче - используй WinAPI-функции. Конкретную функцию не знаю, может кто ещё скажет. Не требует администратора. 3) Если хочется среднего - открывай жесткий диск функцией CreateFile, (в качестве имени устр-ва "\\\\.\\PhysicalDriveN", где N - номер подключенного диска). Работать это будет только с администраторскими правами (все программы работы с жестким диском требуют этих прав). Изменено: убрал одну точку.
doc_jem 1) В оперативной памяти заводишь счетчик, делаешь его равным нулю. 2) В первый байт на винчестере пишешь какой-нибудь символ и увеличиваешь на единичку счетчик и переходишь к следующему байту на винчестере 3) заполняешь свой винчестер символами, пока не получишь системную ошибку 4) после получения системной ошибки "На вашем винчестере удалена операционная система Windows!" посмотри содержание своего счетчика, там будет такое число, сколько всего байт на жестком диске А кроме шуток посмотри ехе-шник и исходный текст в аттаче AndreyMust19 можно и без драйвера обойтись
doc_jem Надо прога, которая считала бы сколько всего байт на жестком диске. - прочитал паспорт харда (АТА-функция 0ECh), из него выяснил, хард ЛБА28 или ЛБА48, соответсвенно забрал объем харда в секторах. Прогу сам напиши.
using System; using System.IO; using System.Reflection; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; public class MainClass { [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes); public static void Main() { ulong freeBytesAvail; ulong totalNumOfBytes; ulong totalNumOfFreeBytes; if (!GetDiskFreeSpaceEx("C:\\", out freeBytesAvail, out totalNumOfBytes, out totalNumOfFreeBytes)) { Console.Error.WriteLine("Error occurred: {0}", Marshal.GetExceptionForHR(Marshal.GetLastWin32Error()).Message); } else { Console.WriteLine("Free disk space:"); Console.WriteLine(" Available bytes : {0}", freeBytesAvail); Console.WriteLine(" Total # of bytes: {0}", totalNumOfBytes); Console.WriteLine(" Total free bytes: {0}", totalNumOfFreeBytes); } } }
Как найти другие разделы я думаю разберешься: syntax = fasm Code (Text): .data A db 'A:\',0 B db 'B:\',0 C db 'C:\',0 D db 'D:\',0 E db 'E:\',0 F db 'F:\',0 G db 'G:\',0 H db 'H:\',0 I db 'I:\',0 J db 'J:\',0 K db 'K:\',0 L db 'L:\',0 M db 'M:\',0 N db 'N:\',0 O db 'O:\',0 P db 'P:\',0 Q db 'Q:\',0 R db 'R:\',0 S db 'S:\',0 T db 'T:\',0 U db 'U:\',0 V db 'V:\',0 W db 'W:\',0 X db 'X:\',0 Y db 'Y:\',0 Z db 'Z:\',0 .code proc Get_Drives_Type, drive invoke GetDriveType,[drive] ; Узнаем тип носителя cmp eax, DRIVE_FIXED je found_in_system ; HDD or Flash за подробностями в MSDN jne error_found found_in_system: invoke SendMessage,[hlegalbox],CB_ADDSTRING,0,[drive] ; Добавляем строку в ComboBox jmp end_scan_loop error_found: cinvoke wsprintf,buffer,error.indent,[drive] invoke MessageBox,[form.hwnd],buffer,0,MB_ICONERROR ; Если что выдаем сообщение о ошибке end_scan_loop: ret endp