I try to implement password filter, so I write a simple password filter.
I followed the document in the MSDN, and make sure that the functions are declared correctly.
I compile in VS 2010.

---

.def file:
==========

```none
LIBRARY myFilt
EXPORTS
   InitializeChangeNotify
   PasswordFilter
   PasswordChangeNotify

```

.cpp file:
==========

```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;
}

```

---

I put myFilt.dll in `%windir%\system32`, add "myFilt" to "Notification Packages" in the registry, restart the computer, change the password, and nothing happens.

I opened depends.exe and saw that the functions are correctly:

```none
InitializeChangeNotify
PasswordChangeNotify
PasswordFilter

```

Where is the mistake??

Thanks.