Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

Запись в MBR   Найти похожие ветки 

 
ArtemESC ©   (2006-08-17 12:38) [0]

Пытаюсь написать маленькую утилиту для сабжа, но
она почему-то не работает...
var
 FS    : TFileStream;
 Handle: THandle;
 FB, EB: Integer;
 arr   : array of byte;
 i     : integer;
begin
Writeln(" "Disc" - is utility to write file in sectors of a disc");
Writeln;
Writeln("          1st parameter - name of the file");
Writeln("          2nd - Disc(For example - A:)");
Writeln("          3d  - BootDisk? (y - make boot disc, n - don""t make boot)");
Writeln("Next parametrs may don""t write...");
Writeln("          4 - First byte of the file...");
Writeln("          5 - End byte of the file...");
 If ParamCount < 3 then
    Writeln("Error. {Count of param}") else
      begin
       If FileExists(ParamStr(1)) then
          begin
          try
           FS := TFileStream.Create(ParamStr(1), fmOpenReadWrite);
           Handle := FileOpen("\\.\"+ParamStr(2), fmOpenReadWrite);
           If (Handle = -1) then Writeln("Error of access to disc...")
           else begin
                 If ParamCount > 3 then
                  FB := StrToInt(ParamStr(4)) else FB := 1;
                 If ParamCount > 4 then
                  EB := StrToInt(ParamStr(4)) else EB := FS.Size;
                  SetLength(arr, EB - FB + 1);
                  FS.Position := FB - 1;
                  FS.Read(arr, EB - FB);
                  FileWrite(Handle, arr, EB - FB);
                  FileClose(Handle);
                end;
          except
            end;
          end else Writeln("Error. File was not found...");
      end;
  Readln;
end.

Что я делаю не так...


 
Ketmar ©   (2006-08-17 12:40) [1]

всё. %-)


 
ArtemESC ©   (2006-08-17 12:42) [2]

Ketmar ©   (17.08.06 12:40) [1]
Может покажешь, как правильно?


 
isasa ©   (2006-08-17 12:42) [3]

Тут эта. А разве MBR в рамках файловой структуры?


 
ArtemESC ©   (2006-08-17 12:46) [4]

isasa ©   (17.08.06 12:42) [3]
Мне сказали, что если
используеться такая вещь "\\.\", то ты как раз работаешь с первыми секторами


 
Ketmar ©   (2006-08-17 12:48) [5]

> [3] isasa ©   (17.08.06 12:42)
всё нормально, CreateFile() на NT позволяет работать с дисками таким образом. но именно CreateFile(), а не TFileStream.

> [2] ArtemESC ©   (17.08.06 12:42)
используй CreateFile(). и не забудь проверить, есть ли у юзера права на чтение/запись секторов таким образом.


 
Ketmar ©   (2006-08-17 12:49) [6]

> [4] ArtemESC ©   (17.08.06 12:46)
а ты не полашайся на "мне сказали". ты справку почитай. по CreateFile(). там всё ражёвано.


 
ArtemESC ©   (2006-08-17 12:50) [7]

Ketmar ©   (17.08.06 12:48) [5]
используй CreateFile(). и не забудь проверить, есть ли у юзера права на чтение/запись секторов таким образом.

А как?


 
tesseract ©   (2006-08-17 12:52) [8]


> ArtemESC ©   (17.08.06 12:50) [7]


CreateFile не сработает на открытии с флагом чтения/записи. GetLastError вернёт по моему ERROR_ACCESS_DENIED.


 
Ketmar ©   (2006-08-17 12:59) [9]

> [7] ArtemESC ©   (17.08.06 12:50)
а справку почитай.


 
ArtemESC ©   (2006-08-17 13:36) [10]

Немного исправил - где я опять ошибся?
var
 FS    : TFileStream;
 Handle: THandle;
 FB, EB: Integer;
 arr   : array of byte;
 i     : integer;
begin
Writeln(" "Disc" - is utility to write file in first sectors of a disc");
Writeln;
Writeln("          1st parameter - name of the file");
Writeln("          2nd - Disc(For example - A:)");
Writeln("Next parametrs may don""t write...");
Writeln("          3 - First byte of the file...");
Writeln("          4 - End byte of the file...");
 If ParamCount < 2 then
    Writeln("Error. {Count of parametrs}") else
      begin
       If FileExists(ParamStr(1)) then
          begin
          try
           FS := TFileStream.Create(ParamStr(1), fmOpenReadWrite);
           Handle := CreateFile(PChar("\\.\"+ParamStr(2)), GENERIC_WRITE, 0,
                         nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

           If (Handle = 0) then Writeln("Error of access to disc...")
           else begin
                 If ParamCount > 2 then
                  FB := StrToInt(ParamStr(3)) else FB := 1;
                 If ParamCount > 3 then
                  EB := StrToInt(ParamStr(4)) else EB := FS.Size;
                  SetLength(arr, EB - FB + 1);
                  FS.Position := FB - 1;
                  FS.Read(arr[0], EB - FB);
                  FileWrite(Handle, arr[0], EB - FB);
                  FileClose(Handle);
                end;
          except
            end;
          end else Writeln("Error. File was not found...");
       end;
  Readln;
end.


 
Чапаев ©   (2006-08-17 13:40) [11]


> If (Handle = 0) then Writeln("Error of access to disc...
> ")

А справку почитать?


 
Ketmar ©   (2006-08-17 13:49) [12]

> [11] Чапаев ©   (17.08.06 13:40)
а в чём проблема?


 
Чапаев ©   (2006-08-17 13:53) [13]


> Ketmar ©   (17.08.06 13:49) [12]

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.


 
Ketmar ©   (2006-08-17 13:57) [14]

> [13] Чапаев ©   (17.08.06 13:53)
упс. пардон, я был не прав. ангелов склероз!


 
ArtemESC ©   (2006-08-17 14:06) [15]

Вместо массива стал использовать string - все вроде работает, кроме  
FileWrite(Handle, Pchar(str)^, EB - FB);


 
Чапаев ©   (2006-08-17 14:10) [16]

Откуда ты этих древних функций набрал? FileOpen, FileWrite...


 
tesseract ©   (2006-08-17 14:11) [17]


> ArtemESC ©   (17.08.06 14:06) [15]

лучше перед записью в Pchar перегони - дожно сработать


 
ArtemESC ©   (2006-08-17 14:11) [18]

Чапаев ©   (17.08.06 14:10) [16]
А что предложете?


 
tesseract ©   (2006-08-17 14:14) [19]


> ArtemESC ©   (17.08.06 14:11) [18]


WriteFile наверное


 
ArtemESC ©   (2006-08-17 14:24) [20]

tesseract ©   (17.08.06 14:14) [19]
Не помогает - WriteFile возвращает False...


 
Чапаев ©   (2006-08-17 14:25) [21]


> WriteFile наверное

Ты знал! Ты знал!


 
tesseract ©   (2006-08-17 14:28) [22]


> ArtemESC ©   (17.08.06 14:24) [20]


значит ошибка в коде.


 
ArtemESC ©   (2006-08-17 14:31) [23]

tesseract ©   (17.08.06 14:28) [22]
Делаю так

                 b := WriteFile(Handle,
                                  Pchar(arr)^,
                                  EB - FB, temp, nil);


 
ArtemESC ©   (2006-08-17 14:34) [24]

ArtemESC ©   (17.08.06 14:31) [23]
arr - это строка


 
Ketmar ©   (2006-08-17 14:35) [25]

> [20] ArtemESC ©   (17.08.06 14:24)
дык ручка, наверное, не от той двери...


 
ArtemESC ©   (2006-08-17 14:36) [26]

Ketmar ©   (17.08.06 14:35) [25]
О чем ты?


 
tesseract ©   (2006-08-17 14:39) [27]


> ArtemESC ©   (17.08.06 14:34) [24]


вот избавься от неё, передавай именно PChar.


 
ArtemESC ©   (2006-08-17 14:45) [28]

tesseract ©   (17.08.06 14:39) [27]
Не помогает
Пишу так, (P - Pchar, в ней точно есть нужное содержимое)                  
b := WriteFile(Handle, P, EB - FB, temp, nil);


 
Ketmar ©   (2006-08-17 14:46) [29]

> [26] ArtemESC ©   (17.08.06 14:36)
о handle.


 
ArtemESC ©   (2006-08-17 14:51) [30]

Ketmar ©   (17.08.06 14:46) [29]
Handle добываю так:
            Handle := CreateFile(PChar("\\.\"+ParamStr(2)), GENERIC_WRITE, 0,
                         nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
и вполне валидный, флоппи-дисковод издает соответствующий звук...


 
Ketmar ©   (2006-08-17 15:06) [31]

> [30] ArtemESC ©   (17.08.06 14:51)
не забыл, что писать надо порциями, кратными размеру сектора?


 
ArtemESC ©   (2006-08-17 15:13) [32]

Ketmar ©   (17.08.06 15:06) [31]
Pchar я сделал размером 512, не помагло...


 
Ketmar ©   (2006-08-17 15:17) [33]

> [32] ArtemESC ©   (17.08.06 15:13)
чего-чего размер? куда-куда? %-)
EB-FB кратно 512?

и: что сообщает RaiseLastWin32Error()?


 
ArtemESC ©   (2006-08-17 15:23) [34]

>> Ketmar ©   (17.08.06 15:17) [33]
>> чего-чего размер? куда-куда? %-)
>> EB-FB кратно 512?
УПС!!! пора мне на кладбище. Теперь все работает... ОГРОМНОЕ СПАСИБО!!!


 
tesseract ©   (2006-08-17 15:26) [35]


>  Handle := CreateFile(PChar("\\.\"+ParamStr(2)), GENERIC_WRITE,
>  0,                          nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
>  0);

SectorSize=512;
попробуй так :

CreateFile(PChar("\\.\"+ParamStr(2)), GENERIC_WRITE, FILE_SHARE_WRITE,  nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,  0);

SetFilePointer(handle,(номерсектора-1)*SectorSize,nil,FILE_BEGIN);

result:= WriteFile(handle,p,SectorSize,temp,nil) and (SectorSize=512);


 
tesseract ©   (2006-08-17 15:26) [36]


> and (SectorSize=512);


не то and (temp=SectorSize);


 
Ketmar ©   (2006-08-17 15:29) [37]

> [35] tesseract ©   (17.08.06 15:26)
да пофигу, как проверять потом. главное, чтобы костюмчик был кратен размеру сектора. %-)


 
ArtemESC ©   (2006-08-17 16:39) [38]

tesseract ©   (17.08.06 15:26) [35]
Ужа разобрался, спасибо...


 
tesseract ©   (2006-08-17 16:43) [39]


> ArtemESC ©   (17.08.06 16:39) [38]


Печатал долго :-)


 
ArtemESC ©   (2006-08-17 16:47) [40]

сожелею...



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.045 c
3-1151493853
antoxa2005
2006-06-28 15:24
2006.09.10
Подскажите, а как пользоваться with lock в FB?


2-1156198672
Ref
2006-08-22 02:17
2006.09.10
DBGrid


2-1155564514
dera
2006-08-14 18:08
2006.09.10
Простой вопрос. Скачал компонент. Как его добавить в Делфи?


15-1155899398
Труп Васи Доброго
2006-08-18 15:09
2006.09.10
Пока!


15-1155547420
Darkwing
2006-08-14 13:23
2006.09.10
Оценка труда программиста.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский