Jump to content

Welcome to MSFN Forum
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. This message will be removed once you have signed in.
Login to Account Create an Account



Photo

ImportPatcher - Find and fix dependency problems

- - - - - IP.38_(3/29/2013) IP.39_(7/06/2013)

  • Please log in to reply
128 replies to this topic

#26
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag
Those using ImportPatcher on 2K, XP, or later might find some registry left-overs in:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping
The PrivateProfileString functions I use to manage .ini files don't use the registry in 9x, but supposedly do in NT.

I plan to move away from the use of .ini files in the near future, so hopefully this problem for NT users will go away soon.

-jumper

Edited by jumper, 09 January 2012 - 07:54 PM.

Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs


How to remove advertisement from MSFN

#27
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag


By doing a substitution of msvcrt.dll for msvcr70.dll (renamed and substituted as msvcr7.dll), msvcr90 or 80 wouldn't work, on two dlls and using my dummy dnsapi.dll, I could get the latest svn build of Inkscape (uploaded just 15 hours ago at the time of this post) to run perfectly. :thumbup

https://skydrive.liv...D11303FA52A!128

Attached are the blank stub.dll with 4 blank export functions and the dnsapi.dll dummy made from it for GTK apps. :hello:


Wow, great work loblo!

Is KernelEx helping at all? And how did you determine what code to put into the stubs?

GTK is a popular toolkit. Qt is another. If we can get them and .Net working, a lot of apps will start to work.

Thanks Jumper.

Of course KernelEx in Windows 2000 compatibility mode is mandatory for running GTK apps.

I did not code anything, I just fired VC6 which I have since years but have never used as I am not a coder, I haven't got a clue about coding, and choose to create a new dll project and I selected the one from the wizard that offered to create some empty skeleton export functions and then I just compiled that. Once this was done I opened the dll with dependency walker and saw there was 4 export function with super weird and rather long names which I hexed to stub1, 2 3 and 4 and this is is the stub.dll I uploaded. After that I just renamed it to dnsapi.dll and hexed two of the export functions to the name of the two functions libgio-2.0-0.dll wants to import from dnsapi and that's all I did and it works. :w00t:

It was possible and in some case still is possible to replace libgio-2.0-0.dll with an older version from around 2009 which doesn't rely on dnsapi.dll but it is becoming increasingly incompatible with other GTK runtime files it is interdependent with, forcing to replace more dlls with older ones to satisfy it to the point it was hardly workable anymore and in some cases not at all so I am glad I found that little hack as it should give a bit of headroom, along with your msvcrx for mscvrt substitution, for running newer GTK apps.

#28
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag


By doing a substitution of msvcrt.dll for msvcr70.dll (renamed and substituted as msvcr7.dll), msvcr90 or 80 wouldn't work, on two dlls and using my dummy dnsapi.dll, I could get the latest svn build of Inkscape (uploaded just 15 hours ago at the time of this post) to run perfectly.

Good call. I tried msvcr71.dll, renamed as msvcr7.dll, and it worked! :)

So msvcr70 and msvcr71 seems to be good replacements for msvcrt. Another way to do the substitution is to put a copy renamed to msvcrt directly in the folder the the app and its dll's. And with more backwards compatibility testing, perhaps msvcr71 can be used as a direct update for msvcrt in the <system> folder. (Oops...Did I just volunteer again :blink:)

If I put msvcrt.dll with an application folder it doesn't get used by it, it always uses the one in the system folder. It seems that's because it is listed under the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs registry key. I think this key forces windows to use the listed dlls only from the location that is specified for them and which is the system dir if no full path is specified. I am not sure it is a good idea to override that by deleting some of those entries as to run core system files or quasi core system files such as msvcrt from other locations as when I experimented a bit with that I recall it led to weird problems with standard win9x programs refusing to start. (Well it was with files from Reactos and Wine I tried so maybe it might work with less or no problems with Microsoft files).

Edited by loblo, 10 January 2012 - 01:04 AM.


#29
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag

If I put msvcrt.dll with an application folder it doesn't get used by it, it always uses the one in the system folder. It seems that's because it is listed under the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs registry key. I think this key forces windows to use the listed dlls only from the location that is specified for them and which is the system dir if no full path is specified. I am not sure it is a good idea to override that by deleting some of those entries as to run core system files or quasi core system files such as msvcrt from other locations as when I experimented a bit with that I recall it led to weird problems with standard win9x programs refusing to start. (Well it was with files from Reactos and Wine I tried so maybe it might work with less or no problems with Microsoft files).

I've copied the msvcr71.dll from SP3 into my system folder. I'm shutting SE down for the night, so I'll exit to DOS and make the switch with msvcrt.dll.

In the morning I'll boot with the 'updated' msvcrt.dll and exercize a bunch of apps. If all goes well, I'll try modifying HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs to make the redirection (in the system folder). Perhaps this key can be used to make module subs on-the-fly without needing help from ImportPatcher. That would be great for redirecting delay-load modules.

 
ImportPatcher.32 is now posted.

I spent a couple of hours Saturday creating PEfinder, a tool that scans all files in a given folder and all sub-folders for valid PE headers. A stripped-down version of ImportPatcher, it filters on any DOS/PE/Optional/Directory field I specify (in the src) and outputs a log file with the filename and field value of the matches. (No UI or run-time options.)

Compared to the dozen or so files I had been testing IP with, I was able to test with thousands of files in just a few minutes. And I found three problems:
  • Empty files caused CreateFileMapping to fail (like dencorso reported)
  • 16-bit apps without full DOS header lacked a valid e_lfanew field leading to GPF if random value pointed past EOF
  • 64-bit modules are PE32+ with longer Optional header, moving Directory table back 16 bytes
Fixes for these issues were ported back to ImportPatcher.32. I also added the bonus character for even-length string names as recently discussed.
Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs

#30
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
By substituting msvcrt for msvcr70 in the Gimp plugin G'Mic I could get rid of the only systematic crash that occurs with it here when using the apply button which is meant to apply the filter on the main image and leave the plugin window open after that. With msvcrt it would crash after application of the filter and now it doesn't anymore which is very cool.

I also tried to make such a substitution for the plugin mathmap which crashes instantly on clicking on some of its scripts/presets entries but in this case it only made matters worst with systematic instant crash in kexbases on lauching the plugin but since it crashes in kexbases it might just well be a KernelEx bug.

Also I think that perrhaps msvcr70 is most compatible with msvcrt as in one instance of the substitutions I made, msvcr71 was missing a function which msvcr70 had.

Edited by loblo, 10 January 2012 - 02:12 PM.


#31
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
Neither msvcr70 or msvcr71 cover all of the NT Msvcrt exports.

msvcr70 is missing:

_get_heap_handle

msvcr71 is missing:

_ctype
void * bad_cast::`scalar deleting destructor'(unsigned int)
void * bad_cast::`vector deleting destructor'(unsigned int)
void * bad_typeid::`scalar deleting destructor'(unsigned int)
void * bad_typeid::`vector deleting destructor'(unsigned int)
void * exception::`scalar deleting destructor'(unsigned int)
void * exception::`vector deleting destructor'(unsigned int)
void * __non_rtti_object::`scalar deleting destructor'(unsigned int)
void * __non_rtti_object::`vector deleting destructor'(unsigned int)

#32
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
I am now using msvcr70 version 7.00.9955.0 as my default msvcrt in the sys dir and so far so good. :thumbup

Edited by loblo, 10 January 2012 - 03:34 PM.


#33
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag
> I am now using msvcr70 version 7.00.9955.0 as my default msvcrt in the sys dir and so far so good. :thumbup

Me too, only I'm using msvcr71. :)

Now I've put 7.00.9981 in my sysdir and set:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs
MSVCRT=MSVCR70 After a restart, MSVCR70 is indeed being used by apps instead of MSVCRT (7.1). So KnownDLLs can be used to redirect modules!

I was able to confirm
Neither msvcr70 or msvcr71 cover all of the NT Msvcrt exports.

msvcr70 is missing:
_get_heap_handle

msvcr71 is missing:
_ctype
but not
void * bad_cast::`scalar deleting destructor'(unsigned int)
void * bad_cast::`vector deleting destructor'(unsigned int)
void * bad_typeid::`scalar deleting destructor'(unsigned int)
void * bad_typeid::`vector deleting destructor'(unsigned int)
void * exception::`scalar deleting destructor'(unsigned int)
void * exception::`vector deleting destructor'(unsigned int)
void * __non_rtti_object::`scalar deleting destructor'(unsigned int)
void * __non_rtti_object::`vector deleting destructor'(unsigned int)
Both 70 and 71 have ??0bad_cast... and so forth so I don't see how they differ. What tool did you use to interpret the encoded function names (and presumably find the above missing from 71)?

If I make a patch to add a _get_heap_handle stub to msvcr70, we may have a nice solution. Otherwise we can try to get the real NT msvcrt itself working...!
Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs

#34
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag

Well, the good news is that substituting "mapi32.dll" for "dwmapi.dll" fixes that particular dependency.

Actually DWMAPI (Microsoft Desktop Window Manager API) has nothing in common with MAPI32 and the substitution only works because RW doesn't seek to import any function from it as can be seen in Dependency Walker so any dll that is compatible with 9x will do (and the same goes with the windowscodecs.dll dependency). And this is unlikely to be an universal situation I guess.

#35
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag

I was able to confirm

Neither msvcr70 or msvcr71 cover all of the NT Msvcrt exports.

msvcr70 is missing:
_get_heap_handle

msvcr71 is missing:
_ctype
but not
void * bad_cast::`scalar deleting destructor'(unsigned int)
void * bad_cast::`vector deleting destructor'(unsigned int)
void * bad_typeid::`scalar deleting destructor'(unsigned int)
void * bad_typeid::`vector deleting destructor'(unsigned int)
void * exception::`scalar deleting destructor'(unsigned int)
void * exception::`vector deleting destructor'(unsigned int)
void * __non_rtti_object::`scalar deleting destructor'(unsigned int)
void * __non_rtti_object::`vector deleting destructor'(unsigned int)
Both 70 and 71 have ??0bad_cast... and so forth so I don't see how they differ. What tool did you use to interpret the encoded function names (and presumably find the above missing from 71)?

If I make a patch to add a _get_heap_handle stub to msvcr70, we may have a nice solution. Otherwise we can try to get the real NT msvcrt itself working...!

Well I did export the list of decorated exports of both files from Dependency Walker and compared them each to the list decorated exports of an NT msvcrt with WinMerge and this what I came up with.

Vista and 7's msvcrt seem to have yet more exports which aren't covered by the msvcr7x. Those two at least and perhaps more:

_except_handler4_common
_ftol2

#36
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag

> I am now using msvcr70 version 7.00.9955.0 as my default msvcrt in the sys dir and so far so good. :thumbup

Me too, only I'm using msvcr71. :)

Now I've put 7.00.9981 in my sysdir and set:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs
MSVCRT=MSVCR70 After a restart, MSVCR70 is indeed being used by apps instead of MSVCRT (7.1). So KnownDLLs can be used to redirect modules!

The fact that there is no need to restart windows for the changes taking place in this key to apply to newer runs of appications ( ;) ) certainly makes it even more interesting as there is potential for redirection on the fly.

If I make a patch to add a _get_heap_handle stub to msvcr70, we may have a nice solution. Otherwise we can try to get the real NT msvcrt itself working...!

It seems there is only one missing import function for NT msvcrt (in ntdll.dll). B)

Edited by loblo, 10 January 2012 - 08:54 PM.


#37
jds

jds

    -DOS+

  • Member
  • PipPipPipPip
  • 603 posts
  • Joined 03-June 08
  • OS:98SE
  • Country: Country Flag

> I am now using msvcr70 version 7.00.9955.0 as my default msvcrt in the sys dir and so far so good. :thumbup

Me too, only I'm using msvcr71. :)

Now I've put 7.00.9981 in my sysdir and ...

Slightly OT, but do you recall where this version of 'msvcr70.dll' comes from? (Mine is only at version "7.00.9466.0".)


Well, the good news is that substituting "mapi32.dll" for "dwmapi.dll" fixes that particular dependency.

Actually DWMAPI (Microsoft Desktop Window Manager API) has nothing in common with MAPI32 and the substitution only works because RW doesn't seek to import any function from it as can be seen in Dependency Walker so any dll that is compatible with 9x will do (and the same goes with the windowscodecs.dll dependency). And this is unlikely to be an universal situation I guess.

What?! Is this MS playing games with us, or what?

Well, I'll definitely try substituting 'windowscodecs.dll' and testing RW again.

Joe.

#38
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag
About three weeks ago U98SESP3.EXE contained:

6.10.9848.0

7.00.9981.0

7.10.7031.4

Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs

#39
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag

Slightly OT, but do you recall where this version of 'msvcr70.dll' comes from? (Mine is only at version "7.00.9466.0".)

I don't where it comes from but anyway I have now updated it with the one from U98SESP3 Jumper mentioned.

#40
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag

Well, I'll definitely try substituting 'windowscodecs.dll' and testing RW again.

I have version 1.4 of that software which doesn't have those dependencies and doesn't have the pesky richedit line insertion error if used with the right riched20.dll. Let me know in case you don't have it and would like to get it (as it doesn't seem to be available for download anymore).

#41
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag
With R70 or R71 subbed for RT in <system>, DevStudio'97 / VC++5.0 gives me dual GPF's in first DM.DLL (Debuggee Module for WinDbg) and then in MFC42.DLL when I try to run a release build. :(

At this point, using KnownDLLs to sub in and out SP3 modules on-the-fly became invaluable--great tip, loblo! :yes:
  • Backing out the RT sub, I reloaded VC5, reloaded the project (IP.33), and clicked 'Run'; no problem.
  • Subbed RT 6.10.9848.0, reloaded VC5; no problem.
  • Subbed MSVCP50 version 5.00.7051 for MSVCP50; no problem.
  • Subbed MFC42.DLL version 6.02.8081.0 for MFC42.DLL; Dual GPF's in DM and MFC42. :(
I read yesterday about MSVC interdependencies and backwards compatibility at fighting-the-msvcrt-dll-hell (See great comment by Andrew on August 9). Remembering that, instead of backing out the MFC42 sub, I also
  • subbed R71 back in...and it worked! (R70 also works.) :)
(Note: this testing was all done with KernelEx 4.52 installed and defaulting to 'off', my normal setup.)

So now I'm worried about M*10,20,30,40, etc. interacting with R70/71 subbed as RT. I haven't actually installed SP3, so this would be a great place for a Newby to jump in, install SP3 then sub in R70/71 for RT and begin testing with older apps. Building a test suit of small apps that exercise various legacy DLL's would be a great help. I'll add this to the Wish List.
Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs

#42
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
I'm having mitigated success using the XPSP2 msvcrt (used in conjunction with the XPSP2 ntdll ).

Msvcrt renamed as msvc9x, ntdll renamed as 9xdll and substituted for ntdll in the renamed msvcrt.

Msvcrt substituted for msvc9x in target test applications.

Works with paint and wordpad but crashes with calc and winipcfg.

An attempt to boot windows with those failed with an error of cmdninst in kernel32.

#43
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
Using msvcr70 in place of msvcrt, it is now possible to run avidemux 2.5.5:

http://sourceforge.n...32.exe/download

The latest version 2.5.6 crashes in libADM_core.dll unfortunately.

#44
rainyd

rainyd

    Advanced Member

  • Member
  • PipPipPip
  • 407 posts
  • Joined 04-April 05
  • OS:98SE
  • Country: Country Flag

Using msvcr70 in place of msvcrt, it is now possible to run avidemux 2.5.5:


What is needed to run Avidemux 2.5.5 ( I have 2.5.3)?

Btw, Xeno knows about ImportPatcher?
Looks like it could be a value add to the KeX project.

#45
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag


Using msvcr70 in place of msvcrt, it is now possible to run avidemux 2.5.5:

What is needed to run Avidemux 2.5.5 ( I have 2.5.3)?

Missing functions imported from msvcrt as you should have guessed.

#46
rainyd

rainyd

    Advanced Member

  • Member
  • PipPipPip
  • 407 posts
  • Joined 04-April 05
  • OS:98SE
  • Country: Country Flag

The latest version 2.5.6 crashes in libADM_core.dll unfortunately.


I've got similar crash with Avidemux 2.5.5.
Additionally there's message about missing ktmdll.dll(?)

#47
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag


The latest version 2.5.6 crashes in libADM_core.dll unfortunately.


I've got similar crash with Avidemux 2.5.5.
Additionally there's message about missing ktmdll.dll(?)

I have just googled for that filename and it seems like it's part of some old and obsolete version of Revolutions Pack so it would perhaps mean that you've got some old RP files hooking in your system and causing those problems.

Perhaps I should disable RP9 myself and see if Avidemux 2.5.6 still crashes in libadm_core, additionally there's message about missing quserex.dll (now that more mysterious), 2.5.5 runs fine here with msvcr70 in place of msvcrt, I have done some video transcoding with it.

#48
rainyd

rainyd

    Advanced Member

  • Member
  • PipPipPip
  • 407 posts
  • Joined 04-April 05
  • OS:98SE
  • Country: Country Flag

I have just googled for that filename and it seems like it's part of some old and obsolete version of Revolutions Pack so it would perhaps mean that you've got some old RP files hooking in your system and causing those problems.


Maybe indeed this an old Revolutions Pack but if I remember correctly, it was called Windows 98 32-Bit Icon Patch.
I haven't idea how to remove it.

Edited by rainyd, 14 January 2012 - 01:21 PM.


#49
loblo

loblo

    Oldbie

  • Member
  • PipPipPipPipPip
  • 761 posts
  • Joined 12-January 10
  • OS:ME
  • Country: Country Flag
Latest version of LMMS running thanks to the msvcrt/msvcr70 subst:

http://www.msfn.org/...post__p__987735

#50
jumper

jumper

    2014 All-American Masters HJ'er

  • Member
  • PipPipPip
  • 485 posts
  • Joined 21-January 11
  • OS:98SE
  • Country: Country Flag
IP.33 is finally done. VC6-style delay load imports took longer than expected. Some design changes were needed that affected a lot of the little details. After much testing and code clean-up, the only casualty was 'Link to copies.' Since this feature is only needed when walking and patching dependent DLLs, I decide not to hold up the release any longer.

From ImportPatcher.c:
// To do:
// create DLL with families of stubs with various parameter counts and return values
// fix 'Link to copies'
// if bind mismatch, unbind by restoring parallel lists, then reprocess
// if ILT null, set to IAT
// list imports even if DLL missing or has no exports
// ordinal support: replace, check, look up name
// function substitution within a bound DLL implies unbinding!
// display TimeDateStamp as words
// custom file search path order w/o app folder, w/ KnownDLLs
// batch process a folder of files: no-walk analyze only; first/last MB or progress window
// dialog box interface
// stub insertion

// Future expansion:
// create inf un/installer for patched file(s)
// After patching, launch
// ExportPatcher: add to a DLL's exports function forwards to a custom DLL

Design feedback requested:
IHAtool - IpHlpApi tester; call various functions and report results
--status-> framework is solid; 22 api's fully supported; preview release coming soon
ComDlg32 wrapper - ComDlgEx meets IpHlpApi wrapper
--status-> PrintDlgExW working in latest SumatraPDF 8^)
Future projects: ImportPatcher40 - dialog interface; Kexter - IP40+Ktree+Kexstubs




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users