无法使用GetProcAddress测试密码过滤器DLL中的函数

时间:2014-07-15 13:00:22

标签: c++ dll

我正在构建密码过滤器,如以下链接所示:http://msdn.microsoft.com/en-us/library/windows/desktop/ms721882(v=vs.85).aspx

我尝试按照MS提供的说明构建一个dll并将其加载到测试机器上,发现由于dll没有加载,显然有些错误。所以我决定在dll上运行一个单元测试程序,但这似乎也不起作用。相反,如果我使用损坏的函数而不使用extern" C"指令或.def文件。我一使用extern" C"或def文件,代码不起作用。

下面的代码生成错误代码127:找不到指定的过程。尽管我使用extern" C"并使用Dependency Walker获取函数的名称,代码告诉我该函数无法找到。

这是单元测试应用程序:

#include "stdafx.h"
#include <Windows.h>
#include <NTSecAPI.h>
#include <strsafe.h>

typedef NTSTATUS (__stdcall *MYPROC)(PUNICODE_STRING, ULONG, PUNICODE_STRING);

int _tmain(int argc, _TCHAR* argv[])
{
    MYPROC ProcAdd;
    HMODULE MyDllHnd = LoadLibrary(TEXT("C:\\Users\\mmatovic\\Documents\\Visual Studio 2012\\Projects\\PasswordFilterUnitTest\\Debug\\PasswordFilter.dll"));
    if (NULL == MyDllHnd)
    {
        DWORD dwError = GetLastError();
        cout << "Error: " << dwError << endl;
    }

    ProcAdd = (MYPROC)GetProcAddress(
        MyDllHnd,
        "PasswordChangeNotify");

    ULONG rid = 0;

    if (NULL != ProcAdd)
    {
        (ProcAdd)((PUNICODE_STRING)"test",(ULONG)0,(PUNICODE_STRING)"test");
    } else {
        DWORD dwProcError = GetLastError();
        cout << "Error: " << dwProcError << endl;
    }

    return 0;
}

以下是实际DLL的代码:

#include "stdafx.h"

#define LOGFILE "c:\\PasswordFilter.txt"

BOOL APIENTRY DllMain( HMODULE hModule,
                   DWORD  ul_reason_for_call,
                   LPVOID lpReserved
                 )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

void WriteToLog (PUNICODE_STRING str)
{
#ifdef LOGFILE
    FILE* log = fopen(LOGFILE, "a");
    if(NULL == log)
    {
        return;
    }
    fprintf(log, "%s\r\n", str);
    fclose(log);
#endif
    return;
}

BOOLEAN __stdcall InitializeChangeNotify(void)
{
    return TRUE;
}

NTSTATUS __stdcall PasswordChangeNotify(
    PUNICODE_STRING UserName,
    ULONG RelativeId,
    PUNICODE_STRING NewPassword
)
{
    WriteToLog(UserName);
    WriteToLog(NewPassword);
    return 0;
}

BOOLEAN __stdcall PasswordFilter(
    PUNICODE_STRING AccountName,
    PUNICODE_STRING FullName,
    PUNICODE_STRING Password,
    BOOLEAN SetOperation
)
{
    return TRUE;
}

最后是.def文件的内容

LIBRARY PasswordFilter

EXPORTS
    InitializeChangeNotify
    PasswordChangeNotify
    PasswordFilter

在VS中为DLL代码生成的stdafx.h文件:

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <stdio.h>
#include <windows.h>
#include <winnt.h>
#include <NTSecAPI.h>

0 个答案:

没有答案