136 lines
4.3 KiB
C++
136 lines
4.3 KiB
C++
|
//---------------------------------------------------------------------------
|
|||
|
#include <windows.h>
|
|||
|
#include <winbase.h>
|
|||
|
#include <winioctl.h>
|
|||
|
#include <io.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <dir.h>
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#pragma argsused
|
|||
|
int main(int argc, char* argv[])
|
|||
|
{
|
|||
|
DWORD dwNotUsed;
|
|||
|
DWORD error=0;
|
|||
|
HANDLE hDrive;
|
|||
|
DISK_GEOMETRY dg_flop_geom;
|
|||
|
char lecteur[4]="a:\0";
|
|||
|
char device[7]="\\\\.\\a:\0";
|
|||
|
int fdboot;
|
|||
|
DWORD dwBsWritten;
|
|||
|
char * buffer;
|
|||
|
char bootfile[14]="data/boot.bin\0";
|
|||
|
struct ffblk files;
|
|||
|
int done;
|
|||
|
int number=0;
|
|||
|
char src[80];
|
|||
|
char dest[80];
|
|||
|
printf("Installation de COS2000\nInserez une disquette et appuyer sur une touche...\n");
|
|||
|
getchar();
|
|||
|
hDrive = CreateFile(device, GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
|
|||
|
printf("Ouverture du peripherique %s\n",lecteur);
|
|||
|
if (hDrive == INVALID_HANDLE_VALUE) {
|
|||
|
printf("Erreur : %s\n",GetLastErrorString());
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if(error!=1&&printf("Determination de la geometrie \n")&&DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &dg_flop_geom, sizeof(dg_flop_geom),&dwNotUsed, NULL) == FALSE) {
|
|||
|
printf("Erreur : %s\n",GetLastErrorString());
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if(error!=1&&(dg_flop_geom.MediaType==FixedMedia||dg_flop_geom.MediaType==RemovableMedia||dg_flop_geom.MediaType==Unknown))
|
|||
|
{
|
|||
|
printf("Erreur : Ceci n'est pas une disquette !\n");
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1&&printf("Positionnement sur le secteur 0\n")&&SetFilePointer(hDrive, 0, NULL, FILE_BEGIN) == -1) {
|
|||
|
printf("Erreur : %s\n",GetLastErrorString());
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1)
|
|||
|
{
|
|||
|
printf("Pistes :%u Secteurs:%u Tetes:%u Taille:%u\n",dg_flop_geom.Cylinders.LowPart,dg_flop_geom.SectorsPerTrack,dg_flop_geom.TracksPerCylinder,dg_flop_geom.BytesPerSector);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
CloseHandle(hDrive);
|
|||
|
}
|
|||
|
if (hDrive == NULL||dg_flop_geom.TracksPerCylinder>2||dg_flop_geom.TracksPerCylinder==0)
|
|||
|
{
|
|||
|
printf("Aucun support valide detecte !");
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1)
|
|||
|
{
|
|||
|
printf("Allocation de memoire\n");
|
|||
|
buffer = (char *)malloc(dg_flop_geom.BytesPerSector);
|
|||
|
printf("Ouverture et installation du fichier de boot %s\n",bootfile);
|
|||
|
}
|
|||
|
if (error!=1&&(fdboot = _rtl_open(bootfile,O_RDONLY | O_BINARY)) == -1 )
|
|||
|
{
|
|||
|
printf("Erreur : Fichier de boot introuvable\n");
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1&&_read(fdboot, buffer, dg_flop_geom.BytesPerSector)!= dg_flop_geom.BytesPerSector)
|
|||
|
{
|
|||
|
printf("Erreur : Fichier de boot de taille incorrecte !\n");
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1&&WriteFile(hDrive, buffer, dg_flop_geom.BytesPerSector, &dwBsWritten, NULL) == 0)
|
|||
|
{
|
|||
|
printf("Ecriture impossible sur le secteur de boot !\n");
|
|||
|
error=1;
|
|||
|
}
|
|||
|
if (error!=1)
|
|||
|
{
|
|||
|
_rtl_close(fdboot);
|
|||
|
printf("Determination des fichiers a copier\n\n");
|
|||
|
done = findfirst("data\\*.*",&files,0);
|
|||
|
while (!done)
|
|||
|
{
|
|||
|
number++;
|
|||
|
done = findnext(&files);
|
|||
|
}
|
|||
|
printf("Copie des fichiers de cos2000\n");
|
|||
|
done = findfirst("data\\*.*",&files,0);
|
|||
|
while (!done)
|
|||
|
{
|
|||
|
printf("%s\n",files.ff_name);
|
|||
|
sprintf(src, "data\\%s",files.ff_name);
|
|||
|
sprintf(dest, "%s\\%s",lecteur,files.ff_name);
|
|||
|
if (!CopyFile(src,dest,false))
|
|||
|
{
|
|||
|
printf("Erreur : fichier impossible a copier %s\n",GetLastErrorString());
|
|||
|
error=1;
|
|||
|
break;
|
|||
|
}
|
|||
|
done = findnext(&files);
|
|||
|
}
|
|||
|
if (!error)
|
|||
|
{
|
|||
|
printf("Installation terminee !\nVeuillez redemarrer votre PC afin de charger le systeme");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
printf("Installation echou<6F> !");
|
|||
|
}
|
|||
|
free(buffer);
|
|||
|
}
|
|||
|
getchar();
|
|||
|
return 0;
|
|||
|
}
|
|||
|
//---------------------------------------------------------------------------
|