📄 obutil.cxx
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
#include <windows.h>
#include <initguid.h>
#include "obexp.hxx"
#include <bt_buffer.h>
#include <bt_ddi.h>
#include <bt_api.h>
#include <intsafe.h>
#if defined (UNDER_CE)
#include <extfile.h>
#endif
#define MAX_SDPRECSIZE 4096
int obutil_IsLocal (WCHAR *szFileName) {
if ((szFileName[0] == '\\') && (szFileName[1] == '\\'))
return FALSE;
#if defined (UNDER_CE)
CEOIDINFO ceOidInfo;
if (CeOidGetInfo(OIDFROMAFS(AFS_ROOTNUM_NETWORK), &ceOidInfo)) {
WCHAR *pszNetRoot = ceOidInfo.infDirectory.szDirName;
DWORD dwNetRootLen = wcslen(pszNetRoot);
if (wcsnicmp(szFileName, pszNetRoot, dwNetRootLen) == 0)
return FALSE;
}
#endif
return TRUE;
}
static int obutil_HexStringToDword (WCHAR*&lpsz, DWORD &Value, int cDigits, WCHAR chDelim) {
Value = 0;
for (int Count = 0; Count < cDigits; Count++, lpsz++)
{
if (*lpsz >= '0' && *lpsz <= '9')
Value = (Value << 4) + *lpsz - '0';
else if (*lpsz >= 'A' && *lpsz <= 'F')
Value = (Value << 4) + *lpsz - 'A' + 10;
else if (*lpsz >= 'a' && *lpsz <= 'f')
Value = (Value << 4) + *lpsz - 'a' + 10;
else
return(FALSE);
}
if (chDelim != 0)
return *lpsz++ == chDelim;
else
return TRUE;
}
int obutil_GetGUID (WCHAR *lpsz, GUID *pguid) {
if (*lpsz++ != '{' )
return FALSE;
DWORD dw;
if (! obutil_HexStringToDword (lpsz, pguid->Data1, sizeof(DWORD)*2, '-'))
return FALSE;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(WORD)*2, '-'))
return FALSE;
pguid->Data2 = (WORD)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(WORD)*2, '-'))
return FALSE;
pguid->Data3 = (WORD)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[0] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, '-'))
return FALSE;
pguid->Data4[1] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[2] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[3] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[4] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[5] = (BYTE)dw;
if (! obutil_HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[6] = (BYTE)dw;
if (! obutil_HexStringToDword (lpsz, dw, sizeof(BYTE)*2, 0))
return FALSE;
pguid->Data4[7] = (BYTE)dw;
if (*lpsz++ != '}' )
return FALSE;
return TRUE;
}
int obutil_PollSocket (SOCKET s) {
FD_SET fd;
FD_ZERO (&fd);
FD_SET (s, &fd);
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
return select (0, &fd, NULL, NULL, &tv);
}
static void obutil_SetUUID16(NodeData *pNode, unsigned short uuid16) {
pNode->type=SDP_TYPE_UUID;
pNode->specificType=SDP_ST_UUID16;
pNode->u.uuid16 = uuid16;
}
static void obutil_SetUINT8(NodeData *pNode, unsigned char uuint8) {
pNode->type= SDP_TYPE_UINT;
pNode->specificType = SDP_ST_UINT8;
pNode->u.uint8 = uuint8;
}
static DWORD obutil_AppendContainer(ISdpNodeContainer *pMainContainer, ISdpNodeContainer *pNewContainer) {
NodeData nodeData;
nodeData.type=SDP_TYPE_CONTAINER;
nodeData.specificType=SDP_ST_NONE;
nodeData.u.container = pNewContainer;
return pMainContainer->AppendNode(&nodeData);
}
int obutil_SdpDelRecord(ULONG hRecord) {
BLOB blob;
BTHNS_SETBLOB delBlob;
WSAQUERYSET Service;
blob.cbSize = sizeof(BTHNS_SETBLOB);
blob.pBlobData = (PBYTE) &delBlob;
ULONG ulSdpVersion = BTH_SDP_VERSION;
memset(&delBlob,0,sizeof(delBlob));
delBlob.pRecordHandle = &hRecord;
delBlob.pSdpVersion = &ulSdpVersion;
memset(&Service,0,sizeof(Service));
Service.dwSize = sizeof(Service);
Service.lpBlob = &blob;
Service.dwNameSpace = NS_BTH;
HINSTANCE hLib = LoadLibrary(L"btdrt.dll");
if (!hLib) {
IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] obutil_SdpAddRecord: Record too big. Max allowed size=%d\n", MAX_SDPRECSIZE));
return GetLastError();
}
int iErr = ERROR_PROC_NOT_FOUND;
typedef int (*BTHNSSETSERVICE)(LPWSAQUERYSET, WSAESETSERVICEOP, DWORD);
BTHNSSETSERVICE pfnBthNsSetService = (BTHNSSETSERVICE )GetProcAddress(hLib, L"BthNsSetService");
if (pfnBthNsSetService)
iErr = pfnBthNsSetService(&Service,RNRSERVICE_DELETE,0);
if (iErr != ERROR_SUCCESS) {
IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] obutil_SdpAddRecord: BthNsSetService returns 0x%08x.\n", iErr));
}
FreeLibrary(hLib);
return iErr;
}
static int obutil_SdpAddRecord(unsigned char *pBuf, unsigned long nSize, ULONG *pRecHandle) {
WSAQUERYSET Service;
UCHAR *pSDPBuf = new UCHAR[MAX_SDPRECSIZE];
if(NULL == pSDPBuf)
return ERROR_OUTOFMEMORY;
BLOB blob;
PBTHNS_SETBLOB addBlob = (PBTHNS_SETBLOB) pSDPBuf;
*pRecHandle = 0;
//blob.cbSize = sizeof(BTHNS_SETBLOB) + nSize - 1;
blob.cbSize = sizeof(BTHNS_SETBLOB) - 1;
if(FAILED(ULongAdd(nSize, blob.cbSize, &blob.cbSize))) {
IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] obutil_SdpAddRecord: Record too big. Max allowed size=%d\n", MAX_SDPRECSIZE));
delete [] pSDPBuf;
return ERROR_BUFFER_OVERFLOW;
}
blob.pBlobData = (PBYTE) addBlob;
if (blob.cbSize > MAX_SDPRECSIZE) {
IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] obutil_SdpAddRecord: Record too big. Max allowed size=%d\n", MAX_SDPRECSIZE));
delete [] pSDPBuf;
ASSERT(FALSE);
return ERROR_BUFFER_OVERFLOW;
}
ULONG ulSdpVersion = BTH_SDP_VERSION;
addBlob->pRecordHandle = pRecHandle;
addBlob->pSdpVersion = &ulSdpVersion;
addBlob->fSecurity = 0;
addBlob->fOptions = 0;
addBlob->ulRecordLength = nSize;
PREFAST_SUPPRESS(419, "Suppressing b/c blob.cbSize is sizeof(BTHNS_SETBLOB) + nSize - 1, if this didnt overflow and is less than MAX_SDPRECSIZE we're okay b/c nSize is a component of cbSize & thats checked");
memcpy(addBlob->pRecord,pBuf,nSize);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -