Here’s the source code of Extended ROM unlocker for:
- HTC Himalaya
- HTC Prophet
- HTC Apache
- HTC Universal
This c++ source works on WindowsMobile 2005 operating system (see the comment in source).
DiskOnChip (DOC) is protected by simple plaintext password, which is readable in bootloader/SPL dumps.
The code is pretty simple and easy, however, if you don’t understand something, feel free to post a comment and ask.
// **********************************************************
// HTC Prophet/Himalaya/Apache/Universal ExtendedROM unlocker
// for WindowsMobile 2005
// by buzz_lightyear
// http://buzzdev.net
// May 2006
// **********************************************************
#include
#include
#include "diskio.h"
#include
#include "ceioctl.h"
#define BUFFER_SIZE 0x200
// this handle works on WindowsMobile2005
LPCTSTR diskname = L"\Extended_ROM\Vol:";
DWORD nReturned = 0;
HANDLE hDevice = NULL;
flProtectionOutput out;
FLStatus PrintFLStatus(const FLStatus bStat) ;
bool PartitionInsertKey(HANDLE hDsk, bool bInsert)
{
BYTE in[10];
in[0]= 0;
// COMMENT/UNCOMMENT as apropriate for given device
// |--------------------- HTC Prophet DOC password
// | |--------------- HTC Himalaya DOC password
// | | |--------- HTC Apache DOC password
// | | | |--- HTC Universal DOC password
in[1]= 'a';//'a';//'A';// a
in[2]= '!';//'Y';//'p';// S
in[3]= '0';//'a';//'a';// r
in[4]= '3';//'L';//'c';// E
in[5]= '2';//'a';//'M';// v
in[6]= '1';//'M';//'V';// I
in[7]= '9';//'i';//'9';// n
in[8]= '1';//'H';//'4';// U
in[9]= bInsert?PROTECTION_INSERT_KEY:PROTECTION_REMOVE_KEY;
memset(&out, 0, sizeof(out));
DWORD nReturned=0;
if (!DeviceIoControl(hDsk, FL_IOCTL_BDTL_HW_PROTECTION, &in, sizeof(in), &out, sizeof(out), &nReturned, NULL)) {
PrintFLStatus(out.status);
return false;
}
//PrintFLStatus(out.status);
return true;
}
bool PartitionChangeType(HANDLE hDsk, DWORD dwType)
{
BYTE in[10];
in[0]= (BYTE)dwType;
in[1]= 'a';//'a';//'A';// a
in[2]= '!';//'Y';//'p';// S
in[3]= '0';//'a';//'a';// r
in[4]= '3';//'L';//'c';// E
in[5]= '2';//'a';//'M';// v
in[6]= '1';//'M';//'V';// I
in[7]= '9';//'i';//'9';// n
in[8]= '1';//'H';//'4';// U
in[9]= PROTECTION_CHANGE_TYPE;
memset(&out, 0, sizeof(out));
DWORD nReturned=0;
if (!DeviceIoControl(hDsk, FL_IOCTL_BDTL_HW_PROTECTION, &in, sizeof(in), &out, sizeof(out), &nReturned, NULL)) {
//error("FL_IOCTL_BDTL_HW_PROTECTION");
PrintFLStatus(out.status);
return false;
}
PrintFLStatus(out.status);
return true;
}
bool unlockdisk(HANDLE hDsk)
{
if (PartitionInsertKey(hDsk, true) && PartitionChangeType(hDsk, PROTECTABLE))
{
return true;
}
return false;
}
//TRACE
void TRACE(LPCTSTR szFormat, ...)
{
TCHAR szBuffer[BUFFER_SIZE];
va_list pArgs;
va_start(pArgs, szFormat);
wvsprintf(szBuffer, szFormat, pArgs);
va_end(pArgs);
_tcscat(szBuffer, TEXT("rn"));
OutputDebugString(szBuffer);
}
FLStatus PrintFLStatus(const FLStatus bStat)
{
switch(bStat)
{
case flOK: TRACE(TEXT("FLStatus: OKn"));
MessageBox(NULL, L"SUCCESS", L"OK", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break;
case flBadFunction:
TRACE(TEXT("FLStatus: BadFunctionn")) ;
break ;
case flFileNotFound:
TRACE(TEXT("FLStatus: FileNotFoundn")) ;
break ;
case flPathNotFound:
TRACE(TEXT("FLStatus: PathNotFoundn")) ;
break ;
case flTooManyOpenFiles:
TRACE(TEXT("FLStatus: TooManyOpenFilesn")) ;
break ;
case flNoWriteAccess:
TRACE(TEXT("FLStatus: NoWriteAccessn")) ;
break ;
case flBadFileHandle:
TRACE(TEXT("FLStatus: BadFileHandlen")) ;
break ;
case flDriveNotAvailable:
TRACE(TEXT("FLStatus: DriveNotAvailablen")) ;
break ;
case flNonFATformat:
TRACE(TEXT("FLStatus: NonFATformatn")) ;
break ;
case flFormatNotSupported:
TRACE(TEXT("FLStatus: FormatNotSupportedn")) ;
break ;
case flNoMoreFiles:
TRACE(TEXT("FLStatus: NoMoreFilesn")) ;
break ;
case flWriteProtect:
TRACE(TEXT("FLStatus: WriteProtectn")) ;
break ;
case flBadDriveHandle:
TRACE(TEXT("FLStatus: BadDriveHandlen")) ;
MessageBox(NULL, L"BadDriveHandle", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
case flDriveNotReady:
TRACE(TEXT("FLStatus: DriveNotReadyn")) ;
MessageBox(NULL, L"DriveNotReady", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
case flUnknownCmd:
TRACE(TEXT("FLStatus: UnknownCmdn")) ;
break ;
case flBadFormat:
TRACE(TEXT("FLStatus: BadFormatn")) ;
break ;
case flBadLength:
TRACE(TEXT("FLStatus: BadLengthn")) ;
break ;
case flDataError:
TRACE(TEXT("FLStatus: DataErrorn")) ;
break ;
case flUnknownMedia:
TRACE(TEXT("FLStatus: UnknownMedian")) ;
break ;
case flSectorNotFound:
TRACE(TEXT("FLStatus: SectorNotFoundn")) ;
break ;
case flOutOfPaper:
TRACE(TEXT("FLStatus: OutOfPapern")) ;
break ;
case flWriteFault:
TRACE(TEXT("FLStatus: WriteFaultn")) ;
break ;
case flReadFault:
TRACE(TEXT("FLStatus: ReadFaultn")) ;
break ;
case flGeneralFailure:
TRACE(TEXT("FLStatus: GeneralFailuren")) ;
break ;
case flDiskChange:
TRACE(TEXT("FLStatus: DiskChangen")) ;
break ;
case flVppFailure:
TRACE(TEXT("FLStatus: VppFailuren")) ;
break ;
case flBadParameter:
TRACE(TEXT("FLStatus: BadParametern")) ;
break ;
case flNoSpaceInVolume:
TRACE(TEXT("FLStatus: NoSpaceInVolumen")) ;
break ;
case flInvalidFATchain:
TRACE(TEXT("FLStatus: InvalidFATchainn")) ;
break ;
case flRootDirectoryFull:
TRACE(TEXT("FLStatus: RootDirectoryFulln")) ;
break ;
case flNotMounted:
TRACE(TEXT("FLStatus: NotMountedn")) ;
break ;
case flPathIsRootDirectory:
TRACE(TEXT("FLStatus: PathIsRootDirectoryn")) ;
break ;
case flNotADirectory:
TRACE(TEXT("FLStatus: NotADirectoryn")) ;
break ;
case flDirectoryNotEmpty:
TRACE(TEXT("FLStatus: DirectoryNotEmptyn")) ;
break ;
case flFileIsADirectory:
TRACE(TEXT("FLStatus: FileIsADirectoryn")) ;
break ;
case flAdapterNotFound:
TRACE(TEXT("FLStatus: AdapterNotFoundn")) ;
break ;
case flFormattingError:
TRACE(TEXT("FLStatus: FormattingErrorn")) ;
break ;
case flNotEnoughMemory:
TRACE(TEXT("FLStatus: NotEnoughMemoryn")) ;
break ;
case flVolumeTooSmall:
TRACE(TEXT("FLStatus: VolumeTooSmalln")) ;
break ;
case flBufferingError:
TRACE(TEXT("FLStatus: BufferingErrorn")) ;
break ;
case flFileAlreadyExists:
TRACE(TEXT("FLStatus: FileAlreadyExistsn")) ;
break ;
case flIncomplete:
TRACE(TEXT("FLStatus: Incompleten")) ;
break ;
case flTimedOut:
TRACE(TEXT("FLStatus: TimedOutn")) ;
break ;
case flTooManyComponents:
TRACE(TEXT("FLStatus: TooManyComponentsn")) ;
break ;
case flTooManyDrives:
TRACE(TEXT("FLStatus: TooManyDrivesn")) ;
break ;
case flTooManyBinaryPartitions:
TRACE(TEXT("FLStatus: TooManyBinaryPartitionsn")) ;
break ;
case flPartitionNotFound:
TRACE(TEXT("FLStatus: PartitionNotFoundn")) ;
break ;
case flFeatureNotSupported:
TRACE(TEXT("FLStatus: FeatureNotSupportedn")) ;
break ;
case flWrongVersion:
TRACE(TEXT("FLStatus: WrongVersionn")) ;
break ;
case flTooManyBadBlocks:
TRACE(TEXT("FLStatus: TooManyBadBlocksn")) ;
break ;
case flNotProtected:
TRACE(TEXT("FLStatus: NotProtectedn")) ;
MessageBox(NULL, L"ExtROM is not protectednwith password.", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
case flBadBBT:
TRACE(TEXT("FLStatus: BadBBTn")) ;
break ;
case flWrongKey:
TRACE(TEXT("FLStatus: WrongKeyn"));
MessageBox(NULL, L"WrongKey", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
case flHWProtection:
TRACE(TEXT("FLStatus: HWProtectionn")) ;
MessageBox(NULL, L"HWProtection", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
case flBadDownload:
TRACE(TEXT("FLStatus: BadDownloadn")) ;
break ;
default:
TRACE(TEXT("FLStatus: Unknown statusn")) ;
MessageBox(NULL, L"Unknown status", L"Error", MB_OK | MB_ICONWARNING | MB_TOPMOST | MB_SETFOREGROUND | MB_APPLMODAL);
break ;
}
return (bStat) ;
}
///////////////////////////////////
///////////////////////////////////
///////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPWSTR pszCmdLine, int nCmdShow)
{
hDevice = CreateFile(diskname, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == NULL || hDevice == INVALID_HANDLE_VALUE)
{
TRACE(TEXT("Create handle failed."));
return 1;
}
TRACE(TEXT("Create handle succeededn"));
if (unlockdisk(hDevice))
{
TRACE(L"Unlockedn");
}
// default:
if(hDevice)
{
CloseHandle(hDevice);
hDevice = NULL;
}
return 0;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////