Great, now the error in kernel32.def is resolved but it gets the same problem in kernel33.def.<div>here is the start of the exports from kernel33.def:</div><div><div>EXPORTS<span class="Apple-tab-span" style="white-space:pre"> </span></div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>_hread @1334</div><div>how can I change this to resolve that?</div><br><div class="gmail_quote">2011/5/1 Rainer Schuetze <span dir="ltr"><<a href="mailto:r.sagitario@gmx.de">r.sagitario@gmx.de</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">It seems you have hit another of those dreaded optlink bugs.<br>
<br>
With less symbols, it works if you declare the imports like this (because of the described name mangling):<br>
<br>
IMPORTS <br>
_imported_hread@0 = kernel33._hread<br>
<br>
2 more notes:<br>
- you don't need to import kernel33.di<br>
- you should not use "SINGLE" in the DATA statement of the def file, it will share the memory across processes.<br>
<br>
<br>
<br>
maarten van damme wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Number overflow?<br>
So I implemented the suggested changes (you can check them out at <a href="http://dl.dropbox.com/u/15024434/version2.zip" target="_blank">http://dl.dropbox.com/u/15024434/version2.zip</a>)<div class="im"><br>
But now I get when I compile it : "kernel32.def(738) : Error 12: Number Overflow: (strange symbol over here)"<br>
<br>
I do agree I should've picked a simpler example but I think the statisfaction will be even bigger if I were to succeed :p<br>
<br></div>
2011/5/1 maarten van damme <<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a> <mailto:<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a>>><div class="im">
<br>
<br>
Wow, thanks for the help<br>
The first thing I did was in the .di file adding extern(windows){ ... }<br>
and now compiling doesn't give errors and when examining with dllexp<br>
I can see that it exports the same functions as the real kernel32.dll :D<br>
<br>
Now I'm going to implement all other suggested changes, thanks a lot<br>
<br>
<br>
2011/4/30 Rainer Schuetze <<a href="mailto:r.sagitario@gmx.de" target="_blank">r.sagitario@gmx.de</a><br></div>
<mailto:<a href="mailto:r.sagitario@gmx.de" target="_blank">r.sagitario@gmx.de</a>>><div><div></div><div class="h5"><br>
<br>
I'm not sure your wrapping will work with kernel32.dll, but in<br>
general here are a few tips:<br>
<br>
- most functions in the windows API use the __stdcall calling<br>
convention in C/C++, which translates to D as "extern(Windows)"<br>
<br>
- this will usually add the number of bytes passed on the stack<br>
as a "@NN" postfix to the function name. This postfix does not<br>
exist in kernel32.dll, but in the import library kernel32.lib<br>
that you find in the dmd lib folder. Maybe you can use the<br>
standard import library, or use the translation shown below.<br>
<br>
- as the exported function and the function you want to chain to<br>
have identical names, you have to change at least one of these<br>
and modify them in some build step. I'd suggest to do this in<br>
the def file:<br>
<br>
The symbols in the d-source file containing:<br>
<br>
----<br>
extern(Windows) HANDLE imported_GetCurrentProcess();<br>
<br>
export extern(Windows) HANDLE internal_GetCurrentProcess()<br>
{<br>
return imported_GetCurrentProcess();<br>
}<br>
----<br>
<br>
can be mapped to other symbols in the def file:<br>
<br>
----<br>
EXPORTS<br>
GetCurrentProcess = internal_GetCurrentProcess<br>
<br>
IMPORTS<br>
imported_GetCurrentProcess = kernel33.GetCurrentProcess<br>
----<br>
<br>
- if you don't know the number of arguments, you should not call<br>
the wrapped function, as this will change the callstack.<br>
Instead, you should just jump to it:<br>
<br>
void internal_hread()<br>
{<br>
asm<br>
{<br>
naked;<br>
jmp imported_hread;<br>
}<br>
}<br>
<br>
I haven't tried all that, though, so there might be some mistakes...<br>
<br>
Rainer<br>
<br>
<br>
<br>
Denis Koroskin wrote:<br>
<br>
On Sat, 30 Apr 2011 13:47:53 +0400, maarten van damme<br></div></div>
<<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a> <mailto:<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a>>><div><div></div>
<div class="h5"><br>
wrote:<br>
<br>
I've changed this, I think I'm still kinda confused with<br>
lib files. They've<br>
told me you can't do something with them without a .di file<br>
So I went ahead and made a kernel33.di file. I now<br>
import it in kernel32.d<br>
and my declaration is<br>
System(C){<br>
export void * exportedfunctionblablabal(){<br>
return exportedfunctionblablablal();<br>
}<br>
....<br>
}<br>
<br>
The file in the directory are:<br>
kernel32.d : <a href="http://dl.dropbox.com/u/15024434/d/kernel32.d" target="_blank">http://dl.dropbox.com/u/15024434/d/kernel32.d</a><br>
kernel33.di : <a href="http://dl.dropbox.com/u/15024434/d/kernel33.di" target="_blank">http://dl.dropbox.com/u/15024434/d/kernel33.di</a><br>
kernel33.lib :<br>
<a href="http://dl.dropbox.com/u/15024434/d/kernel33.lib" target="_blank">http://dl.dropbox.com/u/15024434/d/kernel33.lib</a><br>
kernel33.dll :<br>
<a href="http://dl.dropbox.com/u/15024434/d/kernel33.dll" target="_blank">http://dl.dropbox.com/u/15024434/d/kernel33.dll</a><br>
<br>
I've tried to compile using dmd -d kernel32.d<br>
kernel33.di kernel33.lib but<br>
it throws errors like<br>
"Error 42: Symbol undifined _Dkernel1336_hreadfzpV"<br>
I have literally no clue why this is the case, can<br>
someone help me out or<br>
look at the files?<br>
<br>
2011/4/27 maarten van damme <<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a><br></div></div>
<mailto:<a href="mailto:maartenvd1994@gmail.com" target="_blank">maartenvd1994@gmail.com</a>>><div class="im"><br>
<br>
I'm afraid I've been a little unclear.<br>
I've copied kernel32.dll from the windows dir,<br>
renamed it to kernel33.dll<br>
and generated a .lib from it using implib.<br>
Then I've created a d file with a correct<br>
dllmain(stolen from examples) and<br>
between<br>
<br>
system(C){<br>
export void * exportedfunctionfromkernel33.dll();<br>
export void * exportedfunction2fromkernel33.dll();<br>
....<br>
}<br>
<br>
But it looks like you can't both declare a function<br>
from another lib and<br>
export it at the same time.<br>
<br>
<br>
In your kernel33.di, try making it extern (C) export void*<br>
_hread(); etc. You functions get D mangling otherwise.<br>
<br>
I'd also suggest you to start with a less complex example,<br>
e.g. export only one function, make sure it works, then add<br>
the rest.<br>
<br>
If you think your .lib files doesn't do its job, try using<br>
.def file instead. I find them extremely helpful, and they<br>
are a lot easier to edit/extend.<br>
<br>
Hope that helps.<br>
<br>
<br>
<br>
</div></blockquote>
</blockquote></div><br></div>