Funktionen aus der Ntdll.dll aufrufen



  • Morgen wieso kann ich so keine Funktionen aus der Ntdll.dll aufrufen?
    Ok DbgPrint ist ja eigentlich eine Kernel Funktion soweit ich weiss aber ich kann die Ntdll.dll ja laden und dann müsste ich doch eigentlich auch die Funktionen aus der DLL aufrufen können.

    Laut Dependy File Walker ist der Funktionsaufrufename DbgPrint auch in Ordnung.(Bei einer DLL von mir da muss ich z.b. schreiben @Funktion$qii wenn ich die Funkion aufrufen will)

    #include <iostream>
    #include <windows>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    typedef UINT (CALLBACK* LPFNDLLFUNC1)(char *str1 );
    
    HINSTANCE hDLL;
    LPFNDLLFUNC1 lpfnDllFunc1;
    DWORD dwParam1;
    UINT  uParam2, uReturnVal;
    
    hDLL = LoadLibrary("Ntdll.dll");
    if (hDLL != NULL)
    {
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                               "DbgPrint");
       if (!lpfnDllFunc1)
       {
          // handle the error
          FreeLibrary(hDLL);
       }
       else
       {
          // call the function
          uReturnVal = lpfnDllFunc1("hallo kernel");
       }
    }
    
    return 0;
    }
    


  • Normale Apps können da OutputDebugString() benutzen



  • Aber wieso funktioniert das nicht mit DbgPrint ?
    Ich mein ich greife ja eigentlich richtig auf die Funktion in der DLL zu.



  • Was genau bedeutet "funktioniert nicht"? Findet er die Funktion nicht? Oder crashed der Call? Stimmt die Aufrufkonvention? Weil DbgPrint() erwartet laut msdn eine variable Anzahl an Parametern, kann also schonmal eigentlich gar keine __stdcall Funktion sein...



  • DbgPrint ist ja eine Funktion die man z.b. verwendet wenn man Kernel Treiber Programmiert mit dem Programm DbgView kann man dann sehen wenn die DbgPrint Funktion z.b. Text ausgibt. Weil einen Konsole wo man alles vom Bildschirm ablesen kann oder so gibt es ja so nicht bei Kernel Anwendungen.

    Mit funktioniert nicht meine ich das mir DebugView keinen Text ausgibt.

    Wenn ich jedoch einen Kernel Treiber schreibe der mit DbgPrint irgendwas ausgibt dann sehe ich die Ausgabe auch in DebugView

    http://technet.microsoft.com/en-us/sysinternals/bb896647

    DebugView is an application that lets you monitor debug output on your local system, or any computer on the network that you can reach via TCP/IP. It is capable of displaying both kernel-mode and Win32 debug output, so you don't need a debugger to catch the debug output your applications or device drivers generate, nor do you need to modify your applications or drivers to use non-standard debug output APIs.
    


  • msdn sagt: "Only kernel-mode drivers can call the DbgPrint routine."



  • Mhhm okay, ich dachte halt es könnte funktionieren da es ja im Prinzip auch nur eine Funktion aus einer DLL Datei ist.





  • this works fine for me: (msvc10 x86):

    ULONG (__cdecl *DbgPrint ) (LPCSTR,...) = (ULONG (__cdecl 😉 (LPCSTR,...)) GetProcAddress (GetModuleHandleW (L"ntdll.dll"), "DbgPrint");

    DbgPrint ("dbx -dlltest - did not work %d\n", GetLastError());



  • On my win7x86 sp1 it prints to the kernel debugger only. Not to DbgView !!



  • Skaselbat schrieb:

    Mhhm okay, ich dachte halt es könnte funktionieren da es ja im Prinzip auch nur eine Funktion aus einer DLL Datei ist.

    das hat damit nichts zu tun. lies dir zuzüglich zu obig verlinktem artikel auch mal folgenden durch:
    http://en.wikipedia.org/wiki/Native_API


Log in to reply