7

我尝试实现密码过滤器,所以我写了一个简单的密码过滤器。我按照 MSDN 中的文档进行操作,并确保函数声明正确。我在 VS 2010 中编译。


.def 文件:

LIBRARY myFilt
EXPORTS
   InitializeChangeNotify
   PasswordFilter
   PasswordChangeNotify

.cpp 文件:

#include <windows.h>
#include <stdio.h>
#include <ntsecapi.h>

void writeToLog(const char* szString)
{
    FILE* pFile = fopen("c:\\work\\logFile.txt", "a+");
    if (NULL == pFile)
    {
        return;
    }
    fprintf(pFile, "%s\r\n", szString);
    fclose(pFile);
    return;
}

// Default DllMain implementation
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    OutputDebugString(L"DllMain");
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
BOOLEAN __stdcall InitializeChangeNotify(void)
{
    OutputDebugString(L"InitializeChangeNotify");
    writeToLog("InitializeChangeNotify()");
    return TRUE;
}

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

NTSTATUS __stdcall PasswordChangeNotify(
  PUNICODE_STRING UserName,
  ULONG RelativeId,
  PUNICODE_STRING NewPassword
)
{
    OutputDebugString(L"PasswordChangeNotify");
    writeToLog("PasswordChangeNotify()");
    return 0;
}

我把myFilt.dll放进去%windir%\system32,在注册表的“Notification Packages”中添加“myFilt”,重启电脑,修改密码,没有任何反应。

我打开了depends.exe,看到功能是正确的:

InitializeChangeNotify
PasswordChangeNotify
PasswordFilter

哪里错了??

谢谢。

4

2 回答 2

1

我发现了问题!我将运行时库从多线程调试 DLL (/MDd) 更改为多线程调试 (/MTd),它运行良好!:)

– user1375970 5 月 5 日 10:38

于 2012-07-29T18:59:11.410 回答
0

通知包 指定在设置或更改密码时加载或调用的动态链接库 (DLL)。要指定多个文件,请在每个文件名之间按 ENTER 键依次列出文件名。

高人一等!</p>

于 2016-09-22T01:56:28.743 回答