⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obutil.cxx

📁 Windows CE 6.0 Server 源码
💻 CXX
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -