You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
682 lines
13 KiB
682 lines
13 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dllentry.c
|
|
|
|
Abstract:
|
|
|
|
Module's entry points.
|
|
|
|
Author:
|
|
|
|
Ovidiu Temereanca (ovidiut) 02-Jul-2000 Initial implementation
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
#include "hwdbp.h"
|
|
|
|
|
|
//
|
|
// Implementation
|
|
//
|
|
|
|
|
|
PCSTR
|
|
pConvertMultiSzToAnsi (
|
|
IN PCWSTR MultiSz
|
|
)
|
|
{
|
|
UINT logChars;
|
|
|
|
if (!MultiSz) {
|
|
return NULL;
|
|
}
|
|
|
|
logChars = MultiSzSizeInCharsW (MultiSz);
|
|
|
|
return UnicodeToDbcsN (NULL, MultiSz, logChars);
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbInitializeA (
|
|
IN PCSTR TempDir
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (HwdbpInitialized ()) {
|
|
DEBUGMSGA ((DBG_WARNING, "Module already initialized"));
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// don't call any logging APIs until the log module is actually initialized
|
|
//
|
|
|
|
b = HwdbpInitialize ();
|
|
if (b) {
|
|
if (TempDir) {
|
|
HwdbpSetTempDir (TempDir);
|
|
}
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbInitializeA(%s) succeeded", TempDir));
|
|
}
|
|
|
|
return b;
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbInitializeW (
|
|
IN PCWSTR TempDir
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (HwdbpInitialized ()) {
|
|
DEBUGMSGA ((DBG_WARNING, "Module already initialized"));
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// don't call any logging APIs until the log module is actually initialized
|
|
//
|
|
|
|
b = HwdbpInitialize ();
|
|
|
|
if (b) {
|
|
|
|
if (TempDir) {
|
|
ansi = ConvertWtoA (TempDir);
|
|
HwdbpSetTempDir (ansi);
|
|
} else {
|
|
ansi = NULL;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbInitializeW(%s) succeeded", ansi));
|
|
|
|
if (ansi) {
|
|
FreeConvertedStr (ansi);
|
|
}
|
|
}
|
|
|
|
return b;
|
|
}
|
|
|
|
|
|
VOID
|
|
WINAPI
|
|
HwdbTerminate (
|
|
VOID
|
|
)
|
|
{
|
|
if (!HwdbpInitialized ()) {
|
|
return;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbTerminate(): entering (TID=%u)", GetCurrentThreadId ()));
|
|
HwdbpTerminate ();
|
|
}
|
|
|
|
|
|
HANDLE
|
|
WINAPI
|
|
HwdbOpenA (
|
|
IN PCSTR DatabaseFile OPTIONAL
|
|
)
|
|
{
|
|
PHWDB p;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return NULL;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbOpenA(%s): entering (TID=%u)", DatabaseFile, GetCurrentThreadId ()));
|
|
|
|
p = HwdbpOpen (DatabaseFile);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbOpenA: leaving (p=%p, rc=%u)", p, GetLastError ()));
|
|
|
|
return (HANDLE)p;
|
|
}
|
|
|
|
|
|
HANDLE
|
|
WINAPI
|
|
HwdbOpenW (
|
|
IN PCWSTR DatabaseFile OPTIONAL
|
|
)
|
|
{
|
|
PHWDB p;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return NULL;
|
|
}
|
|
|
|
if (DatabaseFile) {
|
|
ansi = ConvertWtoA (DatabaseFile);
|
|
} else {
|
|
ansi = NULL;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbOpenW(%s): entering (TID=%u)", ansi, GetCurrentThreadId ()));
|
|
|
|
p = HwdbpOpen (ansi);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbOpenW: leaving (p=%p, rc=%u)", p, GetLastError ()));
|
|
|
|
if (ansi) {
|
|
FreeConvertedStr (ansi);
|
|
}
|
|
|
|
return (HANDLE)p;
|
|
}
|
|
|
|
|
|
VOID
|
|
WINAPI
|
|
HwdbClose (
|
|
IN HANDLE Hwdb
|
|
)
|
|
{
|
|
if (!HwdbpInitialized ()) {
|
|
return;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbClose(%p): entering (TID=%u)", Hwdb, GetCurrentThreadId ()));
|
|
|
|
HwdbpClose ((PHWDB)Hwdb);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbClose: leaving (rc=%u)", GetLastError ()));
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbAppendInfsA (
|
|
IN HANDLE Hwdb,
|
|
IN PCSTR SourceDirectory,
|
|
IN HWDBAPPENDINFSCALLBACKA Callback, OPTIONAL
|
|
IN PVOID CallbackContext OPTIONAL
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbAppendInfsA(%p,%s): entering (TID=%u)",
|
|
Hwdb,
|
|
SourceDirectory,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpAppendInfs ((PHWDB)Hwdb, SourceDirectory, Callback, CallbackContext, FALSE);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAppendInfsA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbAppendInfsW (
|
|
IN HANDLE Hwdb,
|
|
IN PCWSTR SourceDirectory,
|
|
IN HWDBAPPENDINFSCALLBACKW Callback, OPTIONAL
|
|
IN PVOID CallbackContext OPTIONAL
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
MYASSERT (SourceDirectory);
|
|
ansi = ConvertWtoA (SourceDirectory);
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbAppendInfsW(%p,%s): entering (TID=%u)",
|
|
Hwdb,
|
|
ansi,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpAppendInfs ((PHWDB)Hwdb, ansi, (HWDBAPPENDINFSCALLBACKA)Callback, CallbackContext, TRUE);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAppendInfsW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
FreeConvertedStr (ansi);
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbAppendDatabase (
|
|
IN HANDLE HwdbTarget,
|
|
IN HANDLE HwdbSource
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbAppendDatabase(%p,%p): entering (TID=%u)",
|
|
HwdbTarget,
|
|
HwdbSource
|
|
));
|
|
|
|
b = HwdbpAppendDatabase ((PHWDB)HwdbTarget, (PHWDB)HwdbSource);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAppendDatabase: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbFlushA (
|
|
IN HANDLE Hwdb,
|
|
IN PCSTR OutputFile
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbFlushA(%p,%s): entering (TID=%u)",
|
|
Hwdb,
|
|
OutputFile,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpFlush ((PHWDB)Hwdb, OutputFile);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbFlushA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbFlushW (
|
|
IN HANDLE Hwdb,
|
|
IN PCWSTR OutputFile
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
MYASSERT (OutputFile);
|
|
ansi = ConvertWtoA (OutputFile);
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbFlushW(%p,%s): entering (TID=%u)",
|
|
Hwdb,
|
|
ansi,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpFlush ((PHWDB)Hwdb, ansi);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbFlushW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
FreeConvertedStr (ansi);
|
|
|
|
return b;
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbHasDriverA (
|
|
IN HANDLE Hwdb,
|
|
IN PCSTR PnpId,
|
|
OUT PBOOL Unsupported
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbHasDriverA(%p,%s,%p): entering (TID=%u)",
|
|
Hwdb,
|
|
PnpId,
|
|
Unsupported,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpHasDriver ((PHWDB)Hwdb, PnpId, Unsupported);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbHasDriverA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbHasDriverW (
|
|
IN HANDLE Hwdb,
|
|
IN PCWSTR PnpId,
|
|
OUT PBOOL Unsupported
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
MYASSERT (PnpId);
|
|
ansi = ConvertWtoA (PnpId);
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbHasDriverW(%p,%s,%p): entering (TID=%u)",
|
|
Hwdb,
|
|
ansi,
|
|
Unsupported,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpHasDriver ((PHWDB)Hwdb, ansi, Unsupported);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbHasDriverW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
FreeConvertedStr (ansi);
|
|
|
|
return b;
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbHasAnyDriverA (
|
|
IN HANDLE Hwdb,
|
|
IN PCSTR PnpIds,
|
|
OUT PBOOL Unsupported
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbHasAnyDriverA(%p,%s,%p): entering (TID=%u)",
|
|
Hwdb,
|
|
PnpIds,
|
|
Unsupported,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpHasAnyDriver ((PHWDB)Hwdb, PnpIds, Unsupported);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbHasAnyDriverA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
HwdbHasAnyDriverW (
|
|
IN HANDLE Hwdb,
|
|
IN PCWSTR PnpIds,
|
|
OUT PBOOL Unsupported
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
ansi = pConvertMultiSzToAnsi (PnpIds);
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbHasAnyDriverW(%p,%s,%p): entering (TID=%u)",
|
|
Hwdb,
|
|
ansi,
|
|
Unsupported,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpHasAnyDriver ((PHWDB)Hwdb, ansi, Unsupported);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbHasAnyDriverW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
FreeConvertedStr (ansi);
|
|
|
|
return b;
|
|
}
|
|
|
|
#if 0
|
|
|
|
BOOL
|
|
HwdbEnumeratePnpIdA (
|
|
IN HANDLE Hwdb,
|
|
IN PHWDBENUM_CALLBACKA EnumCallback,
|
|
IN PVOID UserContext
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumeratePnpIdA: entering (TID=%u)",
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumeratePnpIdA ((PHWDB)Hwdb, EnumCallback, UserContext);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumeratePnpIdA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
HwdbEnumeratePnpIdW (
|
|
IN HANDLE Hwdb,
|
|
IN PHWDBENUM_CALLBACKW EnumCallback,
|
|
IN PVOID UserContext
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumeratePnpIdW: entering (TID=%u)",
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumeratePnpIdW ((PHWDB)Hwdb, EnumCallback, UserContext);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumeratePnpIdW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
#endif
|
|
|
|
BOOL
|
|
HwdbEnumFirstInfA (
|
|
OUT PHWDBINF_ENUMA EnumPtr,
|
|
IN PCSTR DatabaseFile
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumFirstInfA(%s): entering (TID=%u)",
|
|
DatabaseFile,
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumFirstInfA (EnumPtr, DatabaseFile);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumFirstInfA(%s): leaving (b=%u,rc=%u)", DatabaseFile, b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
HwdbEnumFirstInfW (
|
|
OUT PHWDBINF_ENUMW EnumPtr,
|
|
IN PCWSTR DatabaseFile
|
|
)
|
|
{
|
|
BOOL b;
|
|
PCSTR ansi;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
MYASSERT (DatabaseFile);
|
|
ansi = ConvertWtoA (DatabaseFile);
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumFirstInfW: entering (TID=%u)",
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumFirstInfW (EnumPtr, ansi);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumFirstInfW(%s): leaving (b=%u,rc=%u)", ansi, b, GetLastError ()));
|
|
|
|
FreeConvertedStr (ansi);
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
HwdbEnumNextInfA (
|
|
IN OUT PHWDBINF_ENUMA EnumPtr
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumNextInfA: entering (TID=%u)",
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumNextInfA (EnumPtr);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumNextInfA: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
BOOL
|
|
HwdbEnumNextInfW (
|
|
IN OUT PHWDBINF_ENUMW EnumPtr
|
|
)
|
|
{
|
|
BOOL b;
|
|
|
|
if (!HwdbpInitialized ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
DEBUGMSGA ((
|
|
DBG_VERBOSE,
|
|
"HwdbEnumNextInfW: entering (TID=%u)",
|
|
GetCurrentThreadId ()
|
|
));
|
|
|
|
b = HwdbpEnumNextInfW (EnumPtr);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbEnumNextInfW: leaving (b=%u,rc=%u)", b, GetLastError ()));
|
|
|
|
return b;
|
|
}
|
|
|
|
VOID
|
|
HwdbAbortEnumInfA (
|
|
IN OUT PHWDBINF_ENUMA EnumPtr
|
|
)
|
|
{
|
|
if (!HwdbpInitialized ()) {
|
|
return;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAbortEnumInfA: entering"));
|
|
|
|
HwdbpAbortEnumInfA (EnumPtr);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAbortEnumInfA: leaving"));
|
|
}
|
|
|
|
VOID
|
|
HwdbAbortEnumInfW (
|
|
IN OUT PHWDBINF_ENUMW EnumPtr
|
|
)
|
|
{
|
|
if (!HwdbpInitialized ()) {
|
|
return;
|
|
}
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAbortEnumInfW: entering"));
|
|
|
|
HwdbpAbortEnumInfW (EnumPtr);
|
|
|
|
DEBUGMSGA ((DBG_VERBOSE, "HwdbAbortEnumInfW: leaving"));
|
|
}
|