📄 iis.cpp
字号:
/* * Copyright (c) 1999-2004 Caucho Technology. All rights reserved. * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */#define UNICODE#define INITGUID#include <windows.h>#include <cguid.h>#include <stdio.h>#include "iadmw.h"#include "iiscnfg.h" #include "atlBase.h" #include "setup.h"#define IIS_SERVICE "W3SVC"#define IIS_ROOTS "System\\CurrentControlSet\\Services\\W3SVC\\Parameters\\Virtual Roots"#define IIS_PARAM "System\\CurrentControlSet\\Services\\W3SVC\\Parameters"static intget_string(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int userType, int code, char *data){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; METADATA_RECORD MyData; TCHAR Data[64 * 1024]; MyData.dwMDIdentifier = code; MyData.dwMDAttributes = METADATA_INHERIT; MyData.dwMDUserType = userType; MyData.dwMDDataType = STRING_METADATA; MyData.dwMDDataLen = sizeof(Data); MyData.pbMDData = (unsigned char *) Data; len = sizeof(Data); hRes = pIMeta->GetData(MyHandle, path, &MyData, &len); if (FAILED(hRes)) { return -1; } wcstombs(data, Data, sizeof(Data)); return MyData.dwMDDataLen;}static intadd_multi_string(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int userType, int code, char *data){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; METADATA_RECORD MyData; TCHAR Data[64 * 1024]; TCHAR newData[1024]; int newLen = (strlen(data) + 1) * sizeof(TCHAR); mbstowcs(newData, data, 256); MyData.dwMDIdentifier = code; MyData.dwMDAttributes = METADATA_INHERIT; MyData.dwMDUserType = userType; MyData.dwMDDataType = MULTISZ_METADATA; MyData.dwMDDataLen = sizeof(Data); MyData.pbMDData = (unsigned char *) Data; len = sizeof(Data); hRes = pIMeta->GetData(MyHandle, path, &MyData, &len); if (FAILED(hRes)) { return -1; } TCHAR *ptr; for (ptr = Data; *ptr; ptr += wcslen(ptr) + 1) { if (! memcmp(ptr, newData, newLen)) { return -1; } } memcpy(ptr, newData, newLen); ptr[newLen + 1] = 0; MyData.dwMDDataLen += newLen; hRes = pIMeta->SetData(MyHandle, path, &MyData); return MyData.dwMDDataLen;}static intget_iis_script_dir_from_metabase(char *dir){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; METADATA_HANDLE MyHandle; CComPtr <IMSAdminBase> pIMeta; *dir = 0; CoInitialize(0); hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void **) &pIMeta); if (FAILED(hRes)) { return 0; } //get a handle to the local machine hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, TEXT("/LM/W3SVC/1/ROOT/SCRIPTS"), METADATA_PERMISSION_READ, 20, &MyHandle); int result = -1; if (! FAILED(hRes)) { result = get_string(pIMeta, MyHandle, TEXT("/"), IIS_MD_UT_FILE, MD_VR_PATH, dir); } pIMeta->CloseKey(MyHandle); if (result > 0) return result; //get a handle to the local machine hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, TEXT("/LM/W3SVC/1/ROOT"), METADATA_PERMISSION_READ, 20, &MyHandle); if (! FAILED(hRes)) { char *tail; result = get_string(pIMeta, MyHandle, TEXT("/"), IIS_MD_UT_FILE, MD_VR_PATH, dir); tail = strrchr(dir, '\\'); if (tail) *tail = 0; else { tail = strrchr(dir, '/'); if (tail) *tail = 0; } strcat(dir, "\\scripts"); } pIMeta->CloseKey(MyHandle); return result > 0;}static HKEYreg_lookup(HKEY hkey, TCHAR *path){ HKEY newKey; DWORD rc; rc = RegOpenKeyEx(hkey, path, 0, KEY_QUERY_VALUE, &newKey); if (rc != ERROR_SUCCESS) return 0; return newKey;}static char *reg_query_string(HKEY key, TCHAR *subkey, char *value){ TCHAR buf[1024]; DWORD len = sizeof buf; DWORD type; int rc = RegQueryValueEx(key, subkey, 0, &type, (LPBYTE) buf, &len); if (rc != ERROR_SUCCESS || type != REG_SZ) return 0; wcstombs(value, buf, 1024); return value;}intget_iis_script_dir(char *dir){ *dir = 0; if (get_iis_script_dir_from_metabase(dir)) { return 1; } HKEY hKeyRoot = reg_lookup(HKEY_LOCAL_MACHINE, TEXT(IIS_ROOTS)); if (! hKeyRoot) { strcpy(dir, ""); return 0; } if (reg_query_string(hKeyRoot, TEXT("/SCRIPTS"), dir)) return 1; if (reg_query_string(hKeyRoot, TEXT("/"), dir)) return 1; strcpy(dir, "unknown"); return 1;}static intset_dword_data(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, int type, DWORD data){ HRESULT hRes = 0; METADATA_RECORD MyData; MyData.dwMDIdentifier = code; MyData.dwMDAttributes = METADATA_INHERIT; MyData.dwMDUserType = type; MyData.dwMDDataType = DWORD_METADATA; MyData.dwMDDataLen = sizeof(data); MyData.pbMDData = (unsigned char *) &data; hRes = pIMeta->SetData(MyHandle, path, &MyData); return ! FAILED(hRes);}static intset_boolean_data(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, int type, DWORD data){ HRESULT hRes = 0; METADATA_RECORD MyData; MyData.dwMDIdentifier = code; MyData.dwMDAttributes = METADATA_INHERIT; MyData.dwMDUserType = type; MyData.dwMDDataType = DWORD_METADATA; MyData.dwMDDataLen = sizeof(data); MyData.pbMDData = (unsigned char *) &data; hRes = pIMeta->SetData(MyHandle, path, &MyData); return ! FAILED(hRes);}static intset_dword(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, DWORD data){ return set_dword_data(pIMeta, MyHandle, path, code, IIS_MD_UT_FILE, data);}static intset_data_len(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, int type, char *data, int len){ HRESULT hRes = 0; METADATA_RECORD MyData; TCHAR buf[1024]; mbstowcs(buf, data, 256); memset(&MyData, 0, sizeof(MyData)); MyData.dwMDIdentifier = code; MyData.dwMDAttributes = METADATA_INHERIT; MyData.dwMDUserType = type; MyData.dwMDDataType = STRING_METADATA; MyData.dwMDDataLen = len * sizeof(WCHAR); MyData.pbMDData = (unsigned char *) buf; hRes = pIMeta->SetData(MyHandle, path, &MyData); return ! FAILED(hRes);}static intset_data(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, int type, char *data){ return set_data_len(pIMeta, MyHandle, path, code, type, data, strlen(data) + 1);}static intset_string(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, int code, char *data){ return set_data_len(pIMeta, MyHandle, path, code, IIS_MD_UT_FILE, data, strlen(data) + 1);}static intset_type(CComPtr<IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle, TCHAR *path, char *data){ HRESULT hRes = 0; METADATA_RECORD MyData; TCHAR buf[1024]; mbstowcs(buf, data, 256); memset(&MyData, 0, sizeof(MyData)); MyData.dwMDIdentifier = MD_KEY_TYPE; MyData.dwMDAttributes = METADATA_NO_ATTRIBUTES; MyData.dwMDUserType = IIS_MD_UT_SERVER; MyData.dwMDDataType = STRING_METADATA; MyData.dwMDDataLen = (wcslen(buf) + 1) * sizeof(WCHAR); MyData.pbMDData = (unsigned char *) buf; hRes = pIMeta->SetData(MyHandle, path, &MyData); return ! FAILED(hRes);}static intadd_resin_script_permission(char *script_dir){ METADATA_HANDLE MyHandle; CComPtr <IMSAdminBase> pIMeta; char data[1024]; *data = 0; CoInitialize(0); HRESULT hRes; hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void **) &pIMeta); if (FAILED(hRes)) { return 0; } //get a handle to the local machine hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, TEXT("/LM/W3SVC"), METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); if (FAILED(hRes)) { return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -