// RawDisk.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include <windows.h>
#include <winioctl.h>
#include <stdlib.h>


unsigned char buff[512];

DWORD n_bytes;
FILE *fd;
DWORD offset;
int image_n;

void main(int argc, char **argv)
{
     HANDLE f;
     DWORD bytesIO;
	 DWORD read;
	 char drive_letter;
	 char device[80];

     SET_PARTITION_INFORMATION info1;


	 if(argc < 4){
		 printf("Usage: rawdisk <filename> <image number> <drive letter>\n");
		 exit(-1);
	 }

	drive_letter = *argv[3];
	sprintf(device, "\\\\.\\%c:", drive_letter);


	f = CreateFile(device, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

    info1.PartitionType = PARTITION_NTFT;
    if (!DeviceIoControl(f, IOCTL_DISK_SET_PARTITION_INFO, &info1, sizeof(SET_PARTITION_INFORMATION), NULL, 0, &bytesIO, NULL))
     {
    	 printf("Ioctl failed\n");
 		 CloseHandle(f);
		 exit(-3);
     }

    image_n = atoi(argv[2]);
	offset = image_n * 232960; // 455*512

	if(SetFilePointer(f, offset, NULL, FILE_BEGIN) != offset){
		 printf("SetFilePointer failed\n");
 		 CloseHandle(f);
		 exit(-4);

     }



    n_bytes = 0;
	fd = fopen(argv[1],"rb");
	if(fd == NULL){
		 printf("Can't open %s\n",argv[1]);
		 CloseHandle(f);
		 exit(-2);
	}


	while(1) {
		n_bytes = fread(buff, 512, 1, fd);
		if(n_bytes != 1)
			break;
		WriteFile(f, buff, 512, &read, NULL);
	}

	fclose(fd);
    CloseHandle(f);
} 
