// 과니입니다
// 2008.05.14 오늘의 팁입니다.
// 일주일전 부친상으로 인해 회사를 일주일 쉬었더니 출근하기 정말 힘들었습니다...
// 게을러진 맘을 잡고 팁을 올립니다.
// 오늘의 팁은 USB 드라이브를 안전하게 제거하는 방법입니다.
// 복잡하게 하기보단 최대한 단순하게 하기 위해 드라이브는 임의의 'E:' 드라이브로 정의하였습니다.


procedure TForm1.Button1Click(Sender: TObject);
const
    IOCTL_STORAGE_EJECT_MEDIA = $2D4808;
    COMPLETE_MESSAGE = '드라이브를 안전하게 제거하실 수 있습니다.';
var
    hDevice : THandle;
    dwByteReturned : DWORD;
begin
    hDevice := CreateFile(PChar('\\.\E:'), GENERIC_READ or GENERIC_WRITE,
                         FILE_SHARE_READ or FILE_SHARE_WRITE,
                         nil, OPEN_EXISTING, 0, 0);

    if hDevice = INVALID_HANDLE_VALUE then Exit;

    // 디스크 제거
    DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, dwByteReturned, nil);

    CloseHandle(hDevice);

    Application.MessageBox(PChar(COMPLETE_MESSAGE), 'Information', MB_ICONINFORMATION);
end;