I must have completely misunderstood what you want to do. What do you want to build from kernel33.def? Isn't kernel33.dll the original DLL that you want to intercept by replacing it with the compiled DLL?

maarten van damme wrote:
Great, now the error in kernel32.def is resolved but it gets the same problem in kernel33.def.
here is the start of the exports from kernel33.def:
EXPORTS
_hread @1334
how can I change this to resolve that?

2011/5/1 Rainer Schuetze <[email protected] <mailto:[email protected]>>

    It seems you have hit another of those dreaded optlink bugs.

    With less symbols, it works if you declare the imports like this
    (because of the described name mangling):

    IMPORTS
           _imported_hread@0 =  kernel33._hread

    2 more notes:
    - you don't need to import kernel33.di
    - you should not use "SINGLE" in the DATA statement of the def file,
    it will share the memory across processes.



    maarten van damme wrote:

        Number overflow?
        So I implemented the suggested changes (you can check them out
        at http://dl.dropbox.com/u/15024434/version2.zip)

        But now I get when I compile it : "kernel32.def(738) : Error 12:
        Number Overflow: (strange symbol over here)"

        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

        2011/5/1 maarten van damme <[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>>


           Wow, thanks for the help
           The first thing I did was in the .di file adding
        extern(windows){ .... }
           and now compiling doesn't give errors and when examining with
        dllexp
           I can see that it exports the same functions as the real
        kernel32.dll :D

           Now I'm going to implement all other suggested changes,
        thanks a lot


           2011/4/30 Rainer Schuetze <[email protected]
        <mailto:[email protected]>
           <mailto:[email protected] <mailto:[email protected]>>>


               I'm not sure your wrapping will work with kernel32.dll,
        but in
               general here are a few tips:

               - most functions in the windows API use the __stdcall calling
               convention in C/C++, which translates to D as
        "extern(Windows)"

               - this will usually add the number of bytes passed on the
        stack
               as a "@NN" postfix to the function name. This postfix
        does not
               exist in kernel32.dll, but in the import library kernel32.lib
               that you find in the dmd lib folder. Maybe you can use the
               standard import library, or use the translation shown below..

               - as the exported function and the function you want to
        chain to
               have identical names, you have to change at least one of
        these
               and modify them in some build step. I'd suggest to do this in
               the def file:

               The symbols in the d-source file containing:

               ----
               extern(Windows) HANDLE imported_GetCurrentProcess();

               export extern(Windows) HANDLE internal_GetCurrentProcess()
               {
                return imported_GetCurrentProcess();
               }
               ----

               can be mapped to other symbols in the def file:

               ----
               EXPORTS
                GetCurrentProcess = internal_GetCurrentProcess

               IMPORTS
                imported_GetCurrentProcess = kernel33.GetCurrentProcess
               ----

               - if you don't know the number of arguments, you should
        not call
               the wrapped function, as this will change the callstack.
               Instead, you should just jump to it:

               void internal_hread()
               {
                asm
                {
                  naked;
                  jmp imported_hread;
                }
               }

               I haven't tried all that, though, so there might be some
        mistakes...

               Rainer



               Denis Koroskin wrote:

                   On Sat, 30 Apr 2011 13:47:53 +0400, maarten van damme
                   <[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>>

                   wrote:

                       I've changed this, I think I'm still kinda
        confused with
                       lib files. They've
                       told me you can't do something with them without
        a .di file
                       So I went ahead and made a kernel33.di file.. I now
                       import it in kernel32.d
                       and my declaration is
                       System(C){
                       export void * exportedfunctionblablabal(){
                         return exportedfunctionblablablal();
                       }
                       ....
                       }

                       The file in the directory are:
                       kernel32.d :
        http://dl.dropbox.com/u/15024434/d/kernel32.d
                       kernel33.di :
        http://dl.dropbox.com/u/15024434/d/kernel33.di
                       kernel33.lib :
                       http://dl.dropbox.com/u/15024434/d/kernel33.lib
                       kernel33.dll :
                       http://dl.dropbox.com/u/15024434/d/kernel33.dll

                       I've tried to compile using dmd -d kernel32.d
                       kernel33.di kernel33.lib but
                       it throws errors like
                       "Error 42: Symbol undifined _Dkernel1336_hreadfzpV"
                       I have literally no clue why this is the case, can
                       someone help me out or
                       look at the files?

                       2011/4/27 maarten van damme
        <[email protected] <mailto:[email protected]>
                       <mailto:[email protected]
        <mailto:[email protected]>>>


                           I'm afraid I've been a little unclear.
                           I've copied kernel32.dll from the windows dir,
                           renamed it to kernel33.dll
                           and generated a .lib from it using implib.
                           Then I've created a d file with a correct
                           dllmain(stolen from examples) and
                           between

                           system(C){
                           export void * exportedfunctionfromkernel33.dll();
                           export void *
        exportedfunction2fromkernel33.dll();
                           ....
                           }

                           But it looks like you can't both declare a
        function
                           from another lib and
                           export it at the same time.


                   In your kernel33.di, try making it extern (C) export
        void*
                   _hread(); etc. You functions get D mangling otherwise.

                   I'd also suggest you to start with a less complex
        example,
                   e.g. export only one function, make sure it works,
        then add
                   the rest.

                   If you think your .lib files doesn't do its job, try
        using
                   .def file instead. I find them extremely helpful, and
        they
                   are a lot easier to edit/extend.

                   Hope that helps.




Reply via email to