windows-nt/Source/XPSP1/NT/shell/ext/ratings/mslocusr/mslocusr.cpp
2020-09-26 16:20:57 +08:00

164 lines
3.6 KiB
C++

#include "mslocusr.h"
#include <netspi.h>
#define DECL_CRTFREE
#include <crtfree.h>
/* the following defs will make msluglob.h actually define globals */
#define EXTERN
#define ASSIGN(value) = value
#include "msluglob.h"
HANDLE g_hmtxShell = 0; // Note: Handle is per-instance.
#ifdef DEBUG
BOOL g_fCritical=FALSE;
#endif
HINSTANCE hInstance = NULL;
const char szMutexName[] = "MSLocUsrMutex";
UINT g_cRefThisDll = 0; // Reference count of this DLL.
UINT g_cLocks = 0; // Number of locks on this server.
void LockThisDLL(BOOL fLock)
{
ENTERCRITICAL
{
if (fLock)
g_cLocks++;
else
g_cLocks--;
}
LEAVECRITICAL
}
void RefThisDLL(BOOL fRef)
{
ENTERCRITICAL
{
if (fRef)
g_cRefThisDll++;
else
g_cRefThisDll--;
}
LEAVECRITICAL
}
void Netlib_EnterCriticalSection(void)
{
WaitForSingleObject(g_hmtxShell, INFINITE);
#ifdef DEBUG
g_fCritical=TRUE;
#endif
}
void Netlib_LeaveCriticalSection(void)
{
#ifdef DEBUG
g_fCritical=FALSE;
#endif
ReleaseMutex(g_hmtxShell);
}
void _ProcessAttach()
{
//
// All the per-instance initialization code should come here.
//
// We should not pass TRUE as fInitialOwner, read the CreateMutex
// section of Win32 API help file for detail.
//
::DisableThreadLibraryCalls(::hInstance);
g_hmtxShell = CreateMutex(NULL, FALSE, ::szMutexName); // per-instance
::InitStringLibrary();
}
void _ProcessDetach()
{
UnloadShellEntrypoint();
CloseHandle(g_hmtxShell);
}
STDAPI_(BOOL) DllEntryPoint(HINSTANCE hInstDll, DWORD fdwReason, LPVOID reserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
hInstance = hInstDll;
_ProcessAttach();
}
else if (fdwReason == DLL_PROCESS_DETACH)
{
_ProcessDetach();
}
return TRUE;
}
UINT
NPSCopyNLS (
NLS_STR FAR * pnlsSourceString,
LPVOID lpDestBuffer,
LPDWORD lpBufferSize )
{
if ((!lpBufferSize) || (!lpDestBuffer && (*lpBufferSize != 0))) {
return ERROR_INVALID_PARAMETER;
}
if (pnlsSourceString != NULL) {
DWORD dwDestLen = 0; // bytes copied to dest buffer, including NULL
DWORD dwSourceLen = pnlsSourceString->strlen() + 1; // bytes in source buffer, including NULL
if ((lpDestBuffer) && (*lpBufferSize != 0)) {
NLS_STR nlsDestination( STR_OWNERALLOC_CLEAR, (LPSTR)lpDestBuffer, (UINT) *lpBufferSize );
nlsDestination = *pnlsSourceString; /* copy source string to caller's buffer */
dwDestLen = nlsDestination.strlen() + 1;
}
if (dwSourceLen != dwDestLen) {
// Only update buffersize parameter if there is more data,
// and store source string size, counting NULL.
*lpBufferSize = dwSourceLen;
return ERROR_MORE_DATA;
}
else {
return NOERROR;
}
}
else {
if (*lpBufferSize == 0) {
*lpBufferSize = 1;
return ERROR_MORE_DATA;
}
else {
*(LPSTR)lpDestBuffer = NULL; // validated to not be NULL above
return NOERROR;
}
}
}
DWORD
NPSCopyString (
LPCTSTR lpSourceString,
LPVOID lpDestBuffer,
LPDWORD lpBufferSize )
{
if (lpSourceString != NULL) {
NLS_STR nlsSource( STR_OWNERALLOC, (LPTSTR)lpSourceString );
return NPSCopyNLS ( &nlsSource,
lpDestBuffer,
lpBufferSize );
}
else {
return NPSCopyNLS ( NULL,
lpDestBuffer,
lpBufferSize );
}
}