cmd_registry.cpp
来自「简单的远程控制工具,分为服务器与客户斋,让你了解socket编程的知识.」· C++ 代码 · 共 1,157 行 · 第 1/3 页
CPP
1,157 行
free(svPtr);
pMainWnd->SendStringMsg ((LPCTSTR)svMem);
// IssueAuthCommandReply(cas_from,comid,1,svMem);
free(svMem);
break;
case REG_MULTI_SZ:
sv=(char *)pData;
while(sv[0]!='\0') {
svPtr=EscapeString(sv);
svMem=(char *)malloc(lstrlen(svPtr)+7);;//+2);
lstrcpy (svMem,"MSG: ");
lstrcat(svMem,svPtr);
free(svPtr);
pMainWnd->SendStringMsg ((LPCTSTR)svMem);
// IssueAuthCommandReply(cas_from,comid,1,svMem);
free(svMem);
while(sv[0]!='\0') sv++;
sv++;
}
break;
default:
RegCloseKey(key);
free(pData);
pMainWnd->SendStringMsg ("MSG: Could not get value. Unknown type.");
// IssueAuthCommandReply(cas_from,comid,0,"Could not get value. Unknown type.");
}
// pMainWnd->SendStringMsg ("Value retrieved.");
// IssueAuthCommandReply(cas_from,comid,0,"Value retrieved.");
free(pData);
return 0;
}
int RegDeleteKeyRecurse(HKEY hKey, LPCTSTR lpSubKey, char *svKeyBuf)
{
int nCount;
char svSubKeyBuf[MAX_PATH+1];
HKEY hSubKey;
if(RegOpenKeyEx(hKey,lpSubKey,0,KEY_ALL_ACCESS,&hSubKey)!=ERROR_SUCCESS) {
return -1;
}
nCount=0;
while(RegEnumKey(hSubKey,nCount,svKeyBuf,MAX_PATH)!=ERROR_NO_MORE_ITEMS) {
if(RegDeleteKeyRecurse(hSubKey,svKeyBuf,svSubKeyBuf)==-1) {
RegCloseKey(hSubKey);
return -1;
}
nCount++;
}
RegCloseKey(hSubKey);
RegDeleteKey(hKey,lpSubKey);
return 0;
}
int CmdProc_RegDeleteKey(char *strRegName)
{
char svBuffer[1024];
char svSubKeyBuf[MAX_PATH+1];
CMainFrame *pMainWnd = (CMainFrame *)AfxGetApp ()->m_pMainWnd;
// Get root key
char *svKey,*svNext;
HKEY key;
svKey=GetRootKey(strRegName,&key);
if(svKey==NULL)
{
pMainWnd->SendStringMsg ("Could not delete key. Invalid root key.");
// IssueAuthCommandReply(cas_from,comid,0,"Could not delete key. Invalid root key.");
return -1;
}
// Remove trailing backslash
if(lstrlen(svKey)>1)
{
if(svKey[lstrlen(svKey)-1]=='\\')
{
svKey[lstrlen(svKey)-1]='\0';
}
}
// Open key hierarchy
HKEY subkey;
DWORD dwPerm=KEY_READ;
while(svKey!=NULL) {
svNext=BreakString(svKey,"\\");
if(svNext==NULL) break;
if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS) {
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
wsprintf(svBuffer,"Could not delete key. Unable to open subkey: %.256s", svKey);
pMainWnd->SendStringMsg ((LPCTSTR)svBuffer);
// IssueAuthCommandReply(cas_from,comid,0,svBuffer);
return -1;
}
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
key = subkey;
svKey = svNext;
}
// Recursively delete key (win95 does this automatically, NT does not);
if(RegDeleteKeyRecurse(key,svKey,svSubKeyBuf)==-1)
{
pMainWnd->SendStringMsg ("Could not delete key.");
// IssueAuthCommandReply(cas_from,comid,0,"Could not delete key.");
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
return -1;
}
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
pMainWnd->SendStringMsg ("Key deleted.");
// IssueAuthCommandReply(cas_from,comid,0,"Key deleted.");
return 0;
}
int CmdProc_RegDeleteValue(char *strRegName, char *strRegValue)
{
char svBuffer[1024];
CMainFrame *pMainWnd = (CMainFrame *)AfxGetApp ()->m_pMainWnd;
// Get root key
char *svKey,*svNext;
HKEY key;
svKey=GetRootKey(strRegName,&key);
if(svKey==NULL)
{
pMainWnd->SendStringMsg ("MSG: Could not delete value. Invalid root key.");
// IssueAuthCommandReply(cas_from,comid,0,"Could not delete value. Invalid root key.");
return -1;
}
// Remove trailing backslash
if(lstrlen(svKey)>1) {
if(svKey[lstrlen(svKey)-1]=='\\') {
svKey[lstrlen(svKey)-1]='\0';
}
}
// Open key hierarchy
HKEY subkey;
DWORD dwPerm=KEY_READ;
while(svKey!=NULL)
{
svNext=BreakString(svKey,"\\");
if(svNext==NULL) dwPerm=KEY_READ|KEY_WRITE;
if(RegOpenKeyEx(key, svKey, 0, dwPerm, &subkey) != ERROR_SUCCESS)
{
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
wsprintf(svBuffer,"MSG: Could not delete value. Unable to open subkey: %.256s", svKey);
pMainWnd->SendStringMsg ((LPCTSTR)svBuffer);
// IssueAuthCommandReply(cas_from,comid,0,svBuffer);
return 1;
}
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
key = subkey;
svKey = svNext;
}
// Delete value
if(RegDeleteValue(key,strRegValue) != ERROR_SUCCESS) {
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
pMainWnd->SendStringMsg ("MSG: Could not delete value");
// IssueAuthCommandReply(cas_from,comid,0,"Could not delete value");
return 1;
}
// Clean up
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
// pMainWnd->SendStringMsg ("Value deleted.");
// IssueAuthCommandReply(cas_from,comid,0,"Value deleted.");
return 0;
}
int RegCopyKeyRecurse(HKEY key, HKEY newkey)
{
// Get value length information
char *svSubKeyName=NULL, *svClassName=NULL, *svValueName=NULL;
BYTE *pValueData=NULL;
DWORD cbMaxSubKeyLen, cbMaxClassLen, cbMaxValueNameLen, cbMaxValueDataLen;
DWORD cbSubKeyLen, cbClassLen, cbValueNameLen, cbValueDataLen;
if(RegQueryInfoKey(key,NULL,NULL,NULL,NULL,&cbMaxSubKeyLen,&cbMaxClassLen,NULL,&cbMaxValueNameLen,&cbMaxValueDataLen,NULL,NULL)!=ERROR_SUCCESS) {
return -1;
}
cbMaxValueNameLen++;
cbMaxClassLen++;
cbMaxSubKeyLen++;
svSubKeyName = (char *) malloc(cbMaxSubKeyLen);
svClassName = (char *) malloc(cbMaxClassLen);
svValueName = (char *) malloc(cbMaxValueNameLen);
pValueData = (BYTE *) malloc(cbMaxValueDataLen);
// Copy all values
int count=0;
DWORD dwType;
cbValueNameLen=cbMaxValueNameLen;
cbValueDataLen=cbMaxValueDataLen;
while(RegEnumValue(key,count,svValueName,&cbValueNameLen,NULL,&dwType,pValueData,&cbValueDataLen)!=ERROR_NO_MORE_ITEMS) {
if(RegSetValueEx(newkey,svValueName,0,dwType,pValueData,cbValueDataLen)!=ERROR_SUCCESS) {
free(svClassName);
free(svSubKeyName);
free(svValueName);
free(pValueData);
return -1;
}
cbValueNameLen=cbMaxValueNameLen;
cbValueDataLen=cbMaxValueDataLen;
count++;
}
free(svValueName);
free(pValueData);
// Now go through keys and copy them too, along with security descriptors
count=0;
cbSubKeyLen=cbMaxSubKeyLen;
cbClassLen=cbMaxClassLen;
while(RegEnumKeyEx(key,count,svSubKeyName,&cbSubKeyLen,NULL,svClassName,&cbClassLen,NULL)!=ERROR_NO_MORE_ITEMS) {
HKEY subkey;
if(RegOpenKeyEx(key,svSubKeyName,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&subkey)!=ERROR_SUCCESS) {
free(svClassName);
free(svSubKeyName);
return -1;
}
// Create new key name
DWORD cbSecDesc=0;
SECURITY_DESCRIPTOR *psd=NULL;
if(g_bIsWinNT) {
psd=(SECURITY_DESCRIPTOR *)malloc(cbSecDesc);
pRegGetKeySecurity(subkey,0xF,psd,&cbSecDesc);
} else cbSecDesc=0;
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=psd;
sa.bInheritHandle=FALSE;
HKEY newsubkey;
if(RegCreateKeyEx(newkey,svSubKeyName,0,svClassName,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&sa,&newsubkey,NULL)!=ERROR_SUCCESS) {
if(psd) free(psd);
RegCloseKey(subkey);
free(svSubKeyName);
free(svClassName);
return -1;
}
if(psd) free(psd);
// Recurse into this new key
if(RegCopyKeyRecurse(subkey,newsubkey)==-1) {
RegCloseKey(newsubkey);
RegCloseKey(subkey);
free(svSubKeyName);
free(svClassName);
return -1;
}
RegCloseKey(newsubkey);
RegCloseKey(subkey);
cbSubKeyLen=cbMaxSubKeyLen;
cbClassLen=cbMaxClassLen;
count++;
}
free(svSubKeyName);
free(svClassName);
return 0;
}
int CmdProc_RegRenameKey(char *strRegResName, char *strRegTagName)
{
char svBuffer[1024];
CMainFrame *pMainWnd = (CMainFrame *)AfxGetApp ()->m_pMainWnd;
// Get root key
char *svKey,*svNext;
HKEY key;
svKey=GetRootKey(strRegResName,&key);
if(svKey==NULL)
{
pMainWnd->SendStringMsg ("MSG: Could not open key. Invalid root key.");
// IssueAuthCommandReply(cas_from,comid,0,"Could not open key. Invalid root key.");
return -1;
}
// Remove trailing backslash
if(lstrlen(svKey)>1) {
if(svKey[lstrlen(svKey)-1]=='\\') {
svKey[lstrlen(svKey)-1]='\0';
}
}
// Open key hierarchy
HKEY subkey,hkParent=NULL;
char *svLastKeyName=NULL;
while(svKey!=NULL) {
svNext=BreakString(svKey,"\\");
if(RegOpenKeyEx(key, svKey, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, &subkey) != ERROR_SUCCESS) {
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
wsprintf(svBuffer,"MSG: Could not open key. Unable to open subkey: %.256s", svKey);
pMainWnd->SendStringMsg ((LPCTSTR)svBuffer);
// IssueAuthCommandReply(cas_from,comid,0,svBuffer);
return -1;
}
if(svNext!=NULL) {
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
} else {
hkParent=key;
svLastKeyName=svKey;
}
key = subkey;
svKey = svNext;
}
// Don't rename if keys are the same
if(lstrcmpi(svLastKeyName,strRegTagName)==0) {
if(key!=HKEY_LOCAL_MACHINE && key!=HKEY_USERS && key!=HKEY_CLASSES_ROOT && key!=HKEY_CURRENT_USER && key!=HKEY_CURRENT_CONFIG && key!=HKEY_DYN_DATA)
RegCloseKey(key);
wsprintf(svBuffer,"MSG: Could not rename key. Keys have the same name.");
pMainWnd->SendStringMsg ((LPCTSTR)svBuffer);
// IssueAuthCommandReply(cas_from,comid,0,svBuffer);
return -1;
}
// Create new key name
DWORD cbClass=0,cbSecDesc=0;
SECURITY_DESCRIPTOR *psd=NULL;
char *svClass=NULL;
RegQueryInfoKey(key,NULL,&cbClass,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&cbSecDesc,NULL);
if(cbClass>0) {
svClass=(char *)malloc(cbClass);
RegQueryInfoKey(key,svClass,&cbClass,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
if(g_bIsWinNT) {
psd=(SECURITY_DESCRIPTOR *)malloc(cbSecDesc);
pRegGetKeySecurity(key,0xF,psd,&cbSecDesc);
} else cbSecDesc=0;
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=psd;
sa.bInheritHandle=FALSE;
HKEY newkey;
if(RegCreateKeyEx(hkParent,strRegTagName,0,svClass,0,KEY_ALL_ACCESS|ACCESS_SYSTEM_SECURITY,&sa,&newkey,NULL)!=ERROR_SUCCESS) {
if(svClass) free(svClass);
if(psd) free(psd);
RegCloseKey(hkParent);
RegCloseKey(key);
wsprintf(svBuffer,"MSG: Could not create key.");
pMainWnd->SendStringMsg ((LPCTSTR)svBuffer);
// IssueAuthCommandReply(cas_from,comid,0,svBuffer);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?