1. 함수 원형
2. 인자 설명
3. 헤더 파일
4. 함수 코드
BOOL SetDriveLetter(char chSource,char chTarget)
{
typedef BOOL (WINAPI *SVMP)(LPCSTR,LPCSTR);
typedef BOOL (WINAPI *DVMP)(LPCSTR);
typedef BOOL (WINAPI *GVNFVMP)(LPCSTR,LPSTR,DWORD);
SVMP _SetVolumeMountPoint;
DVMP _DeleteVolumeMountPoint;
GVNFVMP _GetVolumeNameForVolumeMountPoint;
HMODULE hKernel32=GetModuleHandle("Kernel32.dll");
if(NULL==(_DeleteVolumeMountPoint = (DVMP)GetProcAddress(hKernel32,"DeleteVolumeMountPointA")))
return FALSE;
if(NULL==(_SetVolumeMountPoint = (SVMP)GetProcAddress(hKernel32,"SetVolumeMountPointA")))
return FALSE;
if(NULL==(_GetVolumeNameForVolumeMountPoint = (GVNFVMP)GetProcAddress(hKernel32,"GetVolumeNameForVolumeMountPointA")))
return FALSE;
if(!((chSource>='A' && chSource<='Z') || (chSource>='a' && chSource<='z')))
return FALSE;
if(!((chTarget>='A' && chTarget<='Z') || (chTarget>='a' && chTarget<='z')))
return FALSE;
char szSource[3]={0,};
char szTarget[3]={0,};
char szSourceSlh[4]={0,};
char szTargetSlh[4]={0,};
char szSourceGuid[MAX_PATH]={0,};
char szSourceDev[MAX_PATH]={0,};
sprintf(szSource,"%c:",chSource);
sprintf(szTarget,"%c:",chTarget);
sprintf(szSourceSlh,"%c:\\",chSource);
sprintf(szTargetSlh,"%c:\\",chTarget);
// 1. 지정된볼륨의device명을얻어옴
QueryDosDevice(szSource,szSourceDev,MAX_PATH);
// 2. 대상볼륨으로임시적연결을함
if(!DefineDosDevice (DDD_RAW_TARGET_PATH, szTarget,szSourceDev))
return FALSE;
// 3. 대상볼륨의Guid를얻어옴. 실패시NULL로초기화
if(!_GetVolumeNameForVolumeMountPoint(szTargetSlh,szSourceGuid,MAX_PATH))
szSourceGuid[0]='\0'
// 4. 임시적연결을해재
if(!DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
szTarget,szSourceDev))
return FALSE;
// 5. 원본볼륨의연결제거
_DeleteVolumeMountPoint (szSourceSlh);
// 6. 대상볼륨에연결
if(!_SetVolumeMountPoint(szTargetSlh,szSourceGuid))
{
return FALSE;
}
return TRUE;
}