Introduction
How to make device support for Unicode by hack InitLocale function inside coredll.dll entire the system not your application ,this way to set your Arabic Locale entire of System to be able Save Arabic on File . without this you you can't saving Arabic inside file or save note or appointment or calender
Note : we used this way to all device manufacture such as HTC ,ASUS ,InterMek ...etc since the device come without Arabic Locale
Background
Most of Application try to read some of information from Local ,By Function insided frame work or MFC ...etc ,what ever the language you used all Frame work should call InitLocal function inside coredll.dll ,so what you need actually in this case hook this function
Using the code
As we said before we have to obtain pointer for InitLocale Function inside coredll.dll and save it inside fpInitlocale to use it later we will talk more about that .
Also we need to CreateMutex ,BTW it's good to know what mutex meaning
CreateMutex :A mutex is a synchronization object that negotiates mutual exclusion among threads of a single process to avoid simultaneous modifications on common resources such as global variables.
HINSTANCE hinstCore = (HINSTANCE)GetModuleHandle(L"COREDLL");
FARPROC fpInitLocale = GetProcAddress(hinstCore,L"InitLocale");
HANDLE _nlsMutex=CreateMutex(NULL,0,L"NLSMUTEX");
HANDLE _nlsHeap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,4,0,0x10000,L"NLSHEAP");
Now to share memory between process you have to use CreateFileForMapping to make your locale shared between all process
HANDLE hNLSFile, hNLSMap, hNLSOrig;
hNLSFile = CreateFileForMapping(nlsFile,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
hNLSMap = CreateFileMapping(hNLSFile,0,PAGE_READONLY,0,0,L"some nice string longer that 7 chars");
FSMAP *nls = HandleToMap(hNLSMap);
hNLSOrig = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READONLY,0,0,L"NLSFILE");
LPVOID origView=MapViewOfFile(hNLSOrig,6,0,0,0);
FSMAP *orig = HandleToMap(hNLSOrig);
The trick of code here to rename the original Name ,(to make them invisible) ,because all of
already cached inside running process.
orig->name->name[0]='_';
wcscpy(nls->name->name, L"NLSFILE");
FSMAP *nlsHeap= HandleToMap(hNLSOrig);
nlsHeap->name->name[0]='_';
MUTEX *m = HandleToMutex(_nlsMutex);
m->name->name[0]='_';
Now will go to All running Process and inject our NLSFILE and NLSMUTEX instead of original one
PROCESSENTRY32 pe32;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | 0x40000000 , NULL);
pe32.dwSize=sizeof(pe32);
BOOL bb=Process32First(hSnap,&pe32);
while (bb) {
CallInProcess(pe32.th32ProcessID, fpInitLocale, NULL);
pe32.dwSize=sizeof(pe32);
bb=Process32Next(hSnap, &pe32);
}
CloseToolhelp32Snapshot(hSnap);
Finally to use this code Add nls.cpp inside you process and call this function
PatchNLS("\windows\younls.nls");
Mobile Developer with deep Experience in Handheld Device Pocket Pc, Smart Phone in Win32, MFC With more than 8 years ago."Arabizer, Hook Function, Poom, Wirless Application, and low level Application". By C++ MFC and win32
http://windowsmobiledn.blog.com/