#include #include "netconn.h" #include "nconnwrap.h" #pragma warning(disable:4100) // unreferenced formal parameter #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) #define ASSERT(a) BOOL WINAPI IsProtocolInstalledA(LPCSTR pszProtocolDeviceID, BOOL bExhaustive); HRESULT WINAPI InstallProtocolA(LPCSTR pszProtocol, HWND hwndParent, PROGRESS_CALLBACK pfnCallback, LPVOID pvCallbackParam); HRESULT WINAPI RemoveProtocolA(LPCSTR pszProtocol); BOOL WINAPI FindConflictingServiceA(LPCSTR pszWantService, NETSERVICE* pConflict); // // String helper class. Takes in a WCHAR string and converts it to multibyte. // Allocates and frees space if the string is long. // class CStrIn { public: CStrIn(LPCWSTR pwsz); ~CStrIn(); operator char*() {return _psz;}; private: LPSTR _psz; char _sz[128]; }; CStrIn::CStrIn(LPCWSTR pwsz) { if (pwsz) { // // If a string was passed in always return a string - even if it's // the empty string. // _psz = _sz; int cch = WideCharToMultiByte(CP_ACP, 0, pwsz, -1, _sz, ARRAYSIZE(_sz), NULL, NULL); // // If the conversion failed try to allocate a buffer to hold the // multibyte version of the string. // if (0 == cch) { *_sz = '\0'; cch = WideCharToMultiByte(CP_ACP, 0, pwsz, -1, NULL, 0, NULL, NULL); if (cch) { _psz = new char[cch]; if (_psz) { cch = WideCharToMultiByte(CP_ACP, 0, pwsz, -1, _psz, cch, NULL, NULL); if (0 == cch) { delete [] _psz; _psz = _sz; } } else { _psz = _sz; } } } } else { _psz = NULL; } } CStrIn::~CStrIn() { if (_psz != _sz && _psz) { delete [] _psz; } } // // // class CStrOut { public: CStrOut(LPWSTR psz, int cch); operator LPSTR() { return _sz;} operator int() { return ARRAYSIZE(_sz);} void Convert(); private: LPWSTR _psz; int _cch; char _sz[MAX_PATH]; }; CStrOut::CStrOut(LPWSTR psz, int cch) { ASSERT(cch <= ARRAYSIZE(_sz)); _psz = psz; _cch = cch; } void CStrOut::Convert() { if (_psz) { MultiByteToWideChar(CP_ACP, 0, _sz, -1, _psz, _cch); } } // // // class CStrsOut { public: CStrsOut(LPWSTR** pppsz) {_pStructW = pppsz;}; operator LPSTR**() {return _pStructW ? &_pStructA : NULL;}; int Convert(int cStrs); private: int ConvertStruct(LPSTR* pStructA, int nStrs, LPWSTR* pStructW, LPWSTR pszLast); DWORD SizeOfWideCharStruct(LPSTR* pStructA, int cStrs); DWORD SizeOfPointerArea(int cStrs); DWORD SizeOfWideCharStringArea(LPSTR* pStruct, int cStrs); LPSTR EndOfLastString(LPSTR* pStruct, int cStrs); LPSTR StartOfFirstString(LPSTR* pStruct); private: LPWSTR** _pStructW; LPSTR* _pStructA; }; int CStrsOut::ConvertStruct(LPSTR* pStructA, int nStrs, LPWSTR* pStructW, LPWSTR pszLast) { ASSERT(pStructA); ASSERT(nStrs); ASSERT(pStructW); int nRet; LPWSTR pszCurrent = (LPWSTR)&pStructW[nStrs]; for (nRet = 0; nRet < nStrs; nRet++) { pStructW[nRet] = pszCurrent; pszCurrent += MultiByteToWideChar(CP_ACP, 0, pStructA[nRet], -1, pszCurrent, pszLast - pszCurrent); } return nRet; } int CStrsOut::Convert(int cStrs) { int nRet; if (_pStructW) { nRet = 0; if (_pStructA) { DWORD cbStruct = SizeOfWideCharStruct(_pStructA, cStrs); *_pStructW = (LPWSTR*)NetConnAlloc(cbStruct); if (*_pStructW) { nRet = ConvertStruct(_pStructA, cStrs, *_pStructW, (LPWSTR)((BYTE*)*_pStructW + cbStruct)); } NetConnFree(_pStructA); } else { *_pStructW = NULL; } } else { nRet = cStrs; } return nRet; } inline LPSTR CStrsOut::EndOfLastString(LPSTR* pStructA, int nStrs) { return pStructA[nStrs - 1] + lstrlenA(pStructA[nStrs - 1]); } inline LPSTR CStrsOut::StartOfFirstString(LPSTR* pStructA) { return *pStructA; } inline DWORD CStrsOut::SizeOfWideCharStringArea(LPSTR* pStructA, int nStrs) { return ((EndOfLastString(pStructA, nStrs) + 1) - StartOfFirstString(pStructA)) * sizeof(WCHAR); } inline DWORD CStrsOut::SizeOfPointerArea(int nStrs) { return nStrs * sizeof(LPWSTR); } DWORD CStrsOut::SizeOfWideCharStruct(LPSTR* pStructA, int nStrs) { return SizeOfPointerArea(nStrs) + SizeOfWideCharStringArea(pStructA, nStrs); } // // Netservice helper class. Passes in an ansi NETSERVICE structure when // cast to NETSERVICEA. Copies the ansi structure to a unicode structure // coverting the strings. // #undef NETSERVICE class CNetServiceOut { public: CNetServiceOut(NETSERVICE* pNS) {_pNS = pNS;}; operator NETSERVICEA*() {return _pNS ? &_NSA : NULL;}; void Convert(); private: NETSERVICEA _NSA; NETSERVICE* _pNS; }; void CNetServiceOut::Convert() { if (_pNS) { MultiByteToWideChar(CP_ACP, 0, _NSA.szClassKey, -1, _pNS->szClassKey, ARRAYSIZE(_pNS->szClassKey)); MultiByteToWideChar(CP_ACP, 0, _NSA.szDeviceID, -1, _pNS->szDeviceID, ARRAYSIZE(_pNS->szDeviceID)); MultiByteToWideChar(CP_ACP, 0, _NSA.szDisplayName, -1, _pNS->szDisplayName, ARRAYSIZE(_pNS->szDisplayName)); } } // // // #undef NETADAPTER class CNetAdaptersOut { public: CNetAdaptersOut(NETADAPTER** ppNA) {_ppNA = ppNA;}; operator NETADAPTERA**(){return _ppNA ? &_pNAA : NULL;}; int Convert(int cNAA); private: void ConvertNA(NETADAPTERA* pNAA, NETADAPTER* pNA); private: NETADAPTERA* _pNAA; NETADAPTER** _ppNA; }; int CNetAdaptersOut::Convert(int cNAA) { int nRet = 0; *_ppNA = NULL; if (cNAA > 0) { if (_pNAA) { *_ppNA = (NETADAPTER*)NetConnAlloc(sizeof(NETADAPTER) * cNAA); if (*_ppNA) { for (nRet = 0; nRet < cNAA; nRet++) { ConvertNA(&_pNAA[nRet], &(*_ppNA)[nRet]); } NetConnFree(_pNAA); } } } return nRet; } void CNetAdaptersOut::ConvertNA(NETADAPTERA* pNAA, NETADAPTER* pNA) { ASSERT(pNAA); ASSERT(pNA); MultiByteToWideChar(CP_ACP, 0, pNAA->szDisplayName, -1, pNA->szDisplayName, ARRAYSIZE(pNA->szDisplayName)); MultiByteToWideChar(CP_ACP, 0, pNAA->szDeviceID, -1, pNA->szDeviceID, ARRAYSIZE(pNA->szDeviceID)); MultiByteToWideChar(CP_ACP, 0, pNAA->szEnumKey, -1, pNA->szEnumKey, ARRAYSIZE(pNA->szEnumKey)); MultiByteToWideChar(CP_ACP, 0, pNAA->szClassKey, -1, pNA->szClassKey, ARRAYSIZE(pNA->szClassKey)); MultiByteToWideChar(CP_ACP, 0, pNAA->szManufacturer, -1, pNA->szManufacturer, ARRAYSIZE(pNA->szManufacturer)); MultiByteToWideChar(CP_ACP, 0, pNAA->szInfFileName, -1, pNA->szInfFileName, ARRAYSIZE(pNA->szInfFileName)); pNA->bNicType = pNAA->bNicType; pNA->bNetType = pNAA->bNetType; pNA->bNetSubType = pNAA->bNetSubType; pNA->bIcsStatus = pNAA->bIcsStatus; pNA->bError = pNAA->bError; pNA->bWarning = pNAA->bWarning; pNA->devnode = pNAA->devnode; } // // // class CNetAdapterIn { public: CNetAdapterIn(const NETADAPTER* pNA); operator NETADAPTERA*() {return _pNA ? &_NAA : NULL;}; private: const NETADAPTER* _pNA; NETADAPTERA _NAA; }; CNetAdapterIn::CNetAdapterIn(const NETADAPTER* pNA) { _pNA = pNA; if (pNA) { WideCharToMultiByte(CP_ACP, 0, pNA->szDisplayName, -1, _NAA.szDisplayName, ARRAYSIZE(_NAA.szDisplayName), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, pNA->szDeviceID, -1, _NAA.szDeviceID, ARRAYSIZE(_NAA.szDeviceID), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, pNA->szEnumKey, -1, _NAA.szEnumKey, ARRAYSIZE(_NAA.szEnumKey), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, pNA->szClassKey, -1, _NAA.szClassKey, ARRAYSIZE(_NAA.szClassKey), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, pNA->szManufacturer, -1, _NAA.szManufacturer, ARRAYSIZE(_NAA.szManufacturer), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, pNA->szInfFileName, -1, _NAA.szInfFileName, ARRAYSIZE(_NAA.szInfFileName), NULL, NULL); _NAA.bNicType = pNA->bNicType; _NAA.bNetType = pNA->bNetType; _NAA.bNetSubType = pNA->bNetSubType; _NAA.bIcsStatus = pNA->bIcsStatus; _NAA.bError = pNA->bError; _NAA.bWarning = pNA->bWarning; } } // // // #undef IsProtocolInstalled BOOL WINAPI IsProtocolInstalled(LPCWSTR pszProtocolDeviceID, BOOL bExhaustive) { CStrIn CStrProtocolDeviceID(pszProtocolDeviceID); return IsProtocolInstalledA(CStrProtocolDeviceID, bExhaustive); } #undef InstallProtocol HRESULT WINAPI InstallProtocol(LPCWSTR pszProtocol, HWND hwndParent, PROGRESS_CALLBACK pfnCallback, LPVOID pvCallbackParam) { CStrIn CStrProtocol(pszProtocol); return InstallProtocolA(CStrProtocol, hwndParent, pfnCallback, pvCallbackParam); } #undef RemoveProtocol HRESULT WINAPI RemoveProtocol(LPCWSTR pszProtocol) { CStrIn CStrProtocol(pszProtocol); return RemoveProtocolA(CStrProtocol); } #undef FindConflictingService BOOL WINAPI FindConflictingService(LPCWSTR pszWantService, NETSERVICE* pConflict) { BOOL fRet; CStrIn CStrWantService(pszWantService); CNetServiceOut CNSConflict(pConflict); fRet = FindConflictingServiceA(CStrWantService, CNSConflict); if (fRet) { CNSConflict.Convert(); } return fRet; } #undef EnumNetAdapters int WINAPI EnumNetAdapters(NETADAPTER FAR** pprgNetAdapters) { int nRet; CNetAdaptersOut CNANetAdapters(pprgNetAdapters); nRet = EnumNetAdaptersA(CNANetAdapters); nRet = CNANetAdapters.Convert(nRet); return nRet; } /* #undef InstallNetAdapters HRESULT WINAPI InstallNetAdapter(LPCWSTR pszDeviceID, LPCWSTR pszInfPath, HWND hwndParent, PROGRESS_CALLBACK pfnProgress, LPVOID pvCallbackParam) { CStrIn CStrDeviceID(pszDeviceID); CStrIn CStrInfPath(pszInfPath); return InstallNetAdapterA(CStrDeviceID, CStrInfPath, hwndParent, pfnProgress, pvCallbackParam); } */ #undef IsProtocolBoundToAdapter BOOL WINAPI IsProtocolBoundToAdapter(LPCWSTR pszProtocolID, const NETADAPTER* pAdapter) { CStrIn CStrProtocolID(pszProtocolID); CNetAdapterIn CNAAdapter(pAdapter); return IsProtocolBoundToAdapterA(CStrProtocolID, CNAAdapter); } /* #undef ENableNetAdapter HRESULT WINAPI EnableNetAdapter(const NETADAPTER* pAdapter) { CNetAdapterIn CNAAdapter(pAdapter); return EnableNetAdapterA(CNAAdapter); } */ #undef IsClientInstalled BOOL WINAPI IsClientInstalled(LPCWSTR pszClient, BOOL bExhaustive) { CStrIn CStrClient(pszClient); return IsClientInstalledA(CStrClient, bExhaustive); } /* #undef RemoveClient HRESULT WINAPI RemoveClient(LPCWSTR pszClient) { CStrIn CStrClient(pszClient); return RemoveClientA(pszClient); } */ /* #undef RemoveGhostedAdapters HRESULT WINAPI RemoveGhostedAdapters(LPCWSTR pszDeviceID) { CStrIn CStrDeviceID(pszDeviceID); return RemoveGhostedAdaptersA(CStrDeviceID); } */ /* #undef RemoveUnknownAdapters HRESULT WINAPI RemoveUnknownAdapters(LPCWSTR pszDeviceID) { CStrIn CStrDeviceID(pszDeviceID); return RemoveUnknownAdaptersA(CStrDeviceID); } */ /* #undef DoesAdapterMatchDeviceID BOOL WINAPI DoesAdapterMatchDeviceID(const NETADAPTER* pAdapter, LPCWSTR pszDeviceID) { CNetAdapterIn CNAAdapter(pAdapter); CStrIn CStrDeviceID(pszDeviceID); return DoesAdapterMatchDeviceIDA(CNAAdapter, CStrDeviceID); } */ #undef IsAdapterBroadband BOOL WINAPI IsAdapterBroadband(const NETADAPTER* pAdapter) { CNetAdapterIn CNAAdapter(pAdapter); return IsAdapterBroadbandA(CNAAdapter); } #undef SaveBroadbandSettings void WINAPI SaveBroadbandSettings(LPCWSTR pszBroadbandAdapterNumber) { CStrIn CStrBroadbandAdapterNumber(pszBroadbandAdapterNumber); SaveBroadbandSettingsA(CStrBroadbandAdapterNumber); } /* #undef UpdateBroadbandSettings BOOL WINAPI UpdateBroadbandSettings(LPWSTR pszEnumKeyBuf, int cchEnumKeyBuf) { return FALSE; } */ #undef DetectHardware HRESULT WINAPI DetectHardware(LPCWSTR pszDeviceID) { CStrIn CStrDeviceID(pszDeviceID); return DetectHardwareA(CStrDeviceID); } #undef EnableAutodial void WINAPI EnableAutodial(BOOL bAutodial, LPCWSTR pszConnection) { CStrIn CStrConnection(pszConnection); EnableAutodialA(bAutodial, CStrConnection); } #undef SetDefaultDialupConnection void WINAPI SetDefaultDialupConnection(LPCWSTR pszConnectionName) { CStrIn CStrConnectionName(pszConnectionName); SetDefaultDialupConnectionA(CStrConnectionName); } #undef GetDefaultDialupConnection void WINAPI GetDefaultDialupConnection(LPWSTR pszConnectionName, int cchMax) { CStrOut CStrConnectionName(pszConnectionName, cchMax); GetDefaultDialupConnectionA(CStrConnectionName, CStrConnectionName); CStrConnectionName.Convert(); } #undef EnumMatchingNetBindings int WINAPI EnumMatchingNetBindings(LPCWSTR pszParentBinding, LPCWSTR pszDeviceID, LPWSTR** pprgBindings) { int nRet; CStrIn CStrParentBinding(pszParentBinding); CStrIn CStrDeviceID(pszDeviceID); CStrsOut CStrsBindings(pprgBindings); nRet = EnumMatchingNetBindingsA(CStrParentBinding, CStrDeviceID, CStrsBindings); nRet = CStrsBindings.Convert(nRet); return nRet; }