HDD и Assembler

Тема в разделе "WASM.ASSEMBLER", создана пользователем doc_jem, 14 дек 2008.

  1. doc_jem

    doc_jem New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    3
    Всем привет!
    У меня тут маленький вопрос.
    Надо прога, которая считала бы сколько всего байт на жестком диске. Под windows
    Вот только на низкоуровневом языке у меня это не получается. Вроде в Windows XP защита стоит. Или нет?
    Вобщем вопрос как это можно сделать на ассемблере?
    Спасибо.
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Если ты хочешь сам узнать, сколько места на диске:
    1) Пиши драйвер. В драйвере ты можешь написать на ассемблере все что угодно.
    2) Если хочешь полегче - используй WinAPI-функции. Конкретную функцию не знаю, может кто ещё скажет. Не требует администратора.
    3) Если хочется среднего - открывай жесткий диск функцией CreateFile, (в качестве имени устр-ва "\\\\.\\PhysicalDriveN", где N - номер подключенного диска). Работать это будет только с администраторскими правами (все программы работы с жестким диском требуют этих прав).

    Изменено: убрал одну точку.
     
  3. doc_jem

    doc_jem New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    3
    Еще вопрос: "А с дискетой 3-ий вариант подойдет?"
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    doc_jem
    1) В оперативной памяти заводишь счетчик, делаешь его равным нулю.
    2) В первый байт на винчестере пишешь какой-нибудь символ и увеличиваешь на единичку счетчик и переходишь к следующему байту на винчестере
    3) заполняешь свой винчестер символами, пока не получишь системную ошибку
    4) после получения системной ошибки "На вашем винчестере удалена операционная система Windows!" посмотри содержание своего счетчика, там будет такое число, сколько всего байт на жестком диске :)

    А кроме шуток посмотри ехе-шник и исходный текст в аттаче
    AndreyMust19 можно и без драйвера обойтись
     
  5. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    doc_jem
    Надо прога, которая считала бы сколько всего байт на жестком диске. - прочитал паспорт харда (АТА-функция 0ECh), из него выяснил, хард ЛБА28 или ЛБА48, соответсвенно забрал объем харда в секторах. Прогу сам напиши.
     
  6. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    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);
    }
    }
    }
     
  7. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Как найти другие разделы я думаю разберешься:
    syntax = fasm
    Код (Text):
    1. .data
    2.         A                       db 'A:\',0
    3.         B                       db 'B:\',0
    4.         C                       db 'C:\',0
    5.         D                       db 'D:\',0
    6.         E                       db 'E:\',0
    7.         F                       db 'F:\',0
    8.         G                       db 'G:\',0
    9.         H                       db 'H:\',0
    10.         I                       db 'I:\',0
    11.         J                       db 'J:\',0
    12.         K                       db 'K:\',0
    13.         L                       db 'L:\',0
    14.         M                       db 'M:\',0
    15.         N                       db 'N:\',0
    16.         O                       db 'O:\',0
    17.         P                       db 'P:\',0
    18.         Q                       db 'Q:\',0
    19.         R                       db 'R:\',0
    20.         S                       db 'S:\',0
    21.         T                       db 'T:\',0
    22.         U                       db 'U:\',0
    23.         V                       db 'V:\',0
    24.         W                       db 'W:\',0
    25.         X                       db 'X:\',0
    26.         Y                       db 'Y:\',0
    27.         Z                       db 'Z:\',0  
    28.  
    29. .code
    30. proc Get_Drives_Type, drive
    31.  
    32.         invoke  GetDriveType,[drive]   ; Узнаем тип носителя
    33.         cmp     eax, DRIVE_FIXED
    34.         je     found_in_system   ; HDD or Flash за подробностями в MSDN
    35.         jne    error_found
    36.       found_in_system:
    37.         invoke  SendMessage,[hlegalbox],CB_ADDSTRING,0,[drive]    ; Добавляем строку в ComboBox
    38.         jmp     end_scan_loop
    39.       error_found:
    40.         cinvoke wsprintf,buffer,error.indent,[drive]
    41.         invoke  MessageBox,[form.hwnd],buffer,0,MB_ICONERROR   ; Если что выдаем сообщение о ошибке
    42.       end_scan_loop:
    43.         ret
    44. endp
     
  8. doc_jem

    doc_jem New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    3
    Спасибо Вам за советы!
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    dgs
    А что это за басурманский язык в #7 ?