167 lines
5.7 KiB
C++
167 lines
5.7 KiB
C++
//---------------------------------------------------------------------------
|
||
|
||
#include <vcl.h>
|
||
#include <winioctl.h>
|
||
#include <io.h>
|
||
#include <fcntl.h>
|
||
#include <dir.h>
|
||
#pragma hdrstop
|
||
|
||
#include "Unit1.h"
|
||
//---------------------------------------------------------------------------
|
||
#pragma package(smart_init)
|
||
#pragma resource "*.dfm"
|
||
TForm1 *Form1;
|
||
HANDLE hDrive;
|
||
DISK_GEOMETRY dg_flop_geom;
|
||
AnsiString lecteur="b:";
|
||
AnsiString device="\\\\.\\"+lecteur;
|
||
//---------------------------------------------------------------------------
|
||
__fastcall TForm1::TForm1(TComponent* Owner)
|
||
: TForm(Owner)
|
||
{
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
char * GetLastErrorString(void)
|
||
{
|
||
LPVOID lpMsgBuf;
|
||
|
||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||
(LPTSTR) &lpMsgBuf, 0, NULL);
|
||
|
||
return (char *)lpMsgBuf;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
ShowMessages(AnsiString msg)
|
||
{
|
||
Form1->Memo1->Lines->Add(msg);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TForm1::FormShow(TObject *Sender)
|
||
{
|
||
DWORD dwNotUsed;
|
||
DWORD error=0;
|
||
|
||
hDrive = CreateFile(device.c_str(), GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
|
||
ShowMessages("Ouverture du peripherique "+lecteur);
|
||
if (hDrive == INVALID_HANDLE_VALUE) {
|
||
ShowMessages("Erreur : "+AnsiString(GetLastErrorString()));
|
||
error=1;
|
||
}
|
||
if(error!=1&&ShowMessages("Determination de la geometrie ")&&DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &dg_flop_geom, sizeof(dg_flop_geom),&dwNotUsed, NULL) == FALSE) {
|
||
ShowMessages("Erreur : "+AnsiString(GetLastErrorString()));
|
||
error=1;
|
||
}
|
||
if(error!=1&&(dg_flop_geom.MediaType==FixedMedia||dg_flop_geom.MediaType==RemovableMedia||dg_flop_geom.MediaType==Unknown))
|
||
{
|
||
ShowMessages("Erreur : Ceci n'est pas une disquette !");
|
||
error=1;
|
||
}
|
||
if (error!=1&&ShowMessages("Positionnement sur le secteur 0")&&SetFilePointer(hDrive, 0, NULL, FILE_BEGIN) == -1) {
|
||
ShowMessages("Erreur : "+AnsiString(GetLastErrorString()));
|
||
error=1;
|
||
}
|
||
if (error!=1)
|
||
{
|
||
drive->Caption=lecteur.UpperCase();
|
||
track->Caption=IntToStr(dg_flop_geom.Cylinders.LowPart);
|
||
sector->Caption=IntToStr(dg_flop_geom.SectorsPerTrack);
|
||
size->Caption=IntToStr(dg_flop_geom.BytesPerSector);
|
||
head->Caption=IntToStr(dg_flop_geom.TracksPerCylinder);
|
||
allsize->Caption=IntToStr(dg_flop_geom.BytesPerSector*dg_flop_geom.Cylinders.LowPart*dg_flop_geom.SectorsPerTrack*dg_flop_geom.TracksPerCylinder);
|
||
allsector->Caption=IntToStr(dg_flop_geom.Cylinders.LowPart*dg_flop_geom.SectorsPerTrack*dg_flop_geom.TracksPerCylinder);
|
||
}
|
||
else
|
||
{
|
||
CloseHandle(hDrive);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TForm1::Button1Click(TObject *Sender)
|
||
{
|
||
if (hDrive == NULL||dg_flop_geom.TracksPerCylinder>2||dg_flop_geom.TracksPerCylinder==0)
|
||
|
||
{
|
||
ShowMessages("Aucun support valide detect<63> !");
|
||
}
|
||
else
|
||
{
|
||
int fdboot;
|
||
DWORD error=0;
|
||
DWORD dwBsWritten;
|
||
char * buffer;
|
||
AnsiString bootfile="data/boot.bin";
|
||
ShowMessages("Allocation de m<>moire ");
|
||
buffer = (char *)malloc(dg_flop_geom.BytesPerSector);
|
||
ShowMessages("Ouverture et installation du fichier de boot "+bootfile);
|
||
if ((fdboot = _rtl_open(bootfile.c_str(),O_RDONLY | O_BINARY)) == -1 )
|
||
{
|
||
ShowMessages("Erreur : Fichier de boot introuvable");
|
||
error=1;
|
||
}
|
||
if (error!=1&&_read(fdboot, buffer, dg_flop_geom.BytesPerSector)!= dg_flop_geom.BytesPerSector)
|
||
{
|
||
ShowMessages("Erreur : Fichier de boot de taille incorrecte !");
|
||
error=1;
|
||
}
|
||
if (error!=1&&WriteFile(hDrive, buffer, dg_flop_geom.BytesPerSector, &dwBsWritten, NULL) == 0)
|
||
{
|
||
ShowMessages("Ecriture impossible sur le secteur de boot !");
|
||
error=1;
|
||
}
|
||
_rtl_close(fdboot);
|
||
if (error!=1)
|
||
{
|
||
struct ffblk files;
|
||
int done;
|
||
int number=0;
|
||
ShowMessages("D<EFBFBD>termination des fichiers a copier");
|
||
done = findfirst("data/*.*",&files,0);
|
||
while (!done)
|
||
{
|
||
number++;
|
||
done = findnext(&files);
|
||
}
|
||
install->Max=number;
|
||
install->Min=0;
|
||
install->Position=0;
|
||
ShowMessages("Copie des fichiers de cos2000");
|
||
done = findfirst("data/*.*",&files,0);
|
||
while (!done)
|
||
{
|
||
ShowMessages(AnsiString(files.ff_name).LowerCase());
|
||
if (!CopyFile((AnsiString("data/")+AnsiString(files.ff_name)).c_str(),(lecteur+"\\"+AnsiString(files.ff_name)).c_str(),false))
|
||
{
|
||
ShowMessages("Erreur : fichier impossible a copier"+AnsiString(GetLastErrorString()));
|
||
error=1;
|
||
break;
|
||
}
|
||
done = findnext(&files);
|
||
install->Position++;
|
||
}
|
||
if (!error)
|
||
{
|
||
ShowMessages("Installation termin<69>e !");
|
||
Button2->Visible=false;
|
||
Button1->Visible=false;
|
||
Button3->Visible=true;
|
||
}
|
||
else
|
||
ShowMessages("Installation echou<6F> !");
|
||
}
|
||
free(buffer);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
|
||
{
|
||
CloseHandle(hDrive);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TForm1::Button3Click(TObject *Sender)
|
||
{
|
||
Close();
|
||
}
|
||
//---------------------------------------------------------------------------
|