본문 바로가기

Windows/VHD

VHD를 사용하는데 복구시 마다 명령어 입력이 귀찮을때



저같은 경우 C언어를 공부중이라 C언어를 통해서 처리하려고 했습니다.


#include <stdio.h>

#include <stdlib.h>


우선 시스템에 직접 명령을 주려면 system()함수를  써야합니다.

이 함수를 위해 stdlib.h 라이브러리를 우선 인클루드합니다.

만약, PE모드에서 부팅했을 때 어떤 드라이브명인지 모를 경우를 고려한다면 io.h도 같이 인클루드 합니다.


파일의 존재 유무로 해당 파일이 있는 파티션을 찾아서 작업을 해야하는데 이 파일 유무를 체크해주는 함수가 access()함수입니다.

이 함수는 io.h에 들어있습니다.


access()함수에 대해서 여기서는 자세히 알 필요는 없습니다.

access()함수의 사용법은 다음과 같습니다.

access("const char* filename", int amode);

amode로는 여러가지가 있지만 우리는 여기서 0만을 사용합니다. 0은 해당 파일이 있는지 없는지 존재 유무를 체크하는 모드입니다.


저의 경우 파티션의 루트에 clean.vhd가 존재합니다.


int disk_chk;

disk_chk=access("C:\clean.vhd",0);

if(disk_chk==0)

system();


disk_chk=access("D:\clean.vhd",0);

if(disk_chk==0)

system();


disk_chk=access("E:\clean.vhd",0);

if(disk_chk==0)

system();


disk_chk=access("F:\clean.vhd",0);

if(disk_chk==0)

system();


파티션마다 다 찔러봐서 clean.vhd가 존재한다면 system()함수가 동작하게 합니다.

저의 경우 실력 미달로 저렇게 여러줄을 Ctrl + c, v 신공을..^^;


자기자신의 clean.vhd가 pe부팅시 어느 위치에 있는지 명확히 아신다면 위 과정은 생략합니다.(io.h또한 인클루드하지 않아도 됩니다)


이제 system()함수를 구성해야하는데 이것은 별다른 설명이 필요치 않습니다.

()사이에 "명령어"를 넣어주는 것으로 일은 끝납니다.


system("copy E:\clean.vhd E:\child1.vhd");


물론 각 if문에 맞춰서 드라이브문자열은 변경하시기 바랍니다. 파일 경로또한 본인에 맞게 쓰시면 됩니다.




#include <stdio.h>

#include <stdlib.h>


main()

{

int /*drive_check,*/menu;

//char path[] = "C:\clean.vhd";

//char drive = 'C';


printf("Optimized VHD Recovery Program on NAZUNA's Workstation\n\n");

printf("1 : HDD Recovery\n2 : HDD Parent Recovery\n3 : SSD Recovery\n0 : Skip\n");

printf("=>");

scanf("%d",&menu);


/* VHD 파일의 위치를 정확히 알 수 없을 때

for (; drive < 'Z'; ++drive) 

{

path[0] = drive;

drive_check = access(path, 0);

if (drive_check == 0)

break;

}

*/

switch(menu)

{


case 1:


printf("Child VHD CleanUp Start!\n");

system("copy E:\clean.vhd E:\child1.vhd");

printf("child1.vhd Clear\n");

system("copy E:\clean.vhd E:\child2.vhd");

printf("child2.vhd Clear\n");

system("bcdedit /default {232e6f06-175a-11e2-aa26-00190e10ed83}");

printf("Set default child1.vhd\n");

printf("\n Complete! \n");

system("pause");

break;


case 2:

printf("Parent VHD CleanUp Start!\n");

printf("HDD의 VHD 백업 파일의 용량에 따라 십수분 이상 걸릴 수 있습니다.\n");

system("copy E:\bkp\Windows7_Enterprise_K_MSDN.vhd E:\Windows7_Enterprise_K_MSDN.vhd");

printf("Add Parent VHD in bootloader...\n");

system("diskpart /s diskpart_script.txt");

system("bcdboot z:\windows /l ko-kr");

system("bcdedit /default {232e6f0f-175a-11e2-aa26-00190e10ed83}");

printf("\n Complete! \n");

system("pause");

break;


case 3:

printf("SSD OS CleanUp Start!\n");

printf("SSD의 VHD 백업 파일의 용량에 따라 십수분 이상 걸릴 수 있습니다.\n");

system("copy E:\Windows7_Enterprise_K_MSDN.vhd D:\Windows7_Enterprise_K_MSDN.vhd");

printf("\n Complete! \n");

system("pause");

break;


case 0:

break;


default:

system("cls");

printf("잘못된 선택입니다.\n");

main();

break;

}

}



주석이 달린 부분은 아직 미완성인 부분입니다.

컴파일러가 없어도 배포하는 프로그램만으로 스스로 파일을 찾아서 적용케 하려고 했지만 저도 아직은 배우는 입장이다보니 힘드네요 ㅠㅠ


추가.

파일을 찾아 적용하는 구문이 초기에 내가 문자열을 다루는 함수를 거의 몰라서 처리를 하지 못했는데 string.h 에 있는 strcat 함수를 응용하면 

system함수에 본인이 찾은 경로를 바로 입력이 가능하다.

그것을 구현하지 못해서 취소선을 그려두었는데 찾았으니 재 작업할 예정