📄 iis.cpp
字号:
sprintf(data, "1,%s\\isapi_srun.dll,1,,Resin", script_dir); add_multi_string(pIMeta, MyHandle, TEXT("/"), IIS_MD_UT_SERVER, MD_WEB_SVC_EXT_RESTRICTION_LIST, data); pIMeta->CloseKey(MyHandle); return 1;}static char *add_resin_script(CComPtr <IMSAdminBase> pIMeta, TCHAR *name, char *script_path){ HRESULT hRes = 0; METADATA_HANDLE MyHandle; TCHAR *scripts = TEXT("/scripts"); char data[256]; hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, name, METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); if (FAILED(hRes)) { return "Can't open script"; } data[0] = 0; if (get_string(pIMeta, MyHandle, scripts, IIS_MD_UT_SERVER, MD_KEY_TYPE, data) < 0) { pIMeta->AddKey(MyHandle, scripts); } set_type(pIMeta, MyHandle, scripts, "IIsWebVirtualDir"); set_data(pIMeta, MyHandle, scripts, MD_APP_ROOT, IIS_MD_UT_FILE, "/LM/W3SVC/1/Root/scripts"); set_data(pIMeta, MyHandle, scripts, MD_VR_PATH, IIS_MD_UT_FILE, script_path); set_data(pIMeta, MyHandle, scripts, MD_APP_FRIENDLY_NAME, IIS_MD_UT_WAM, "scripts"); set_dword(pIMeta, MyHandle, scripts, MD_ACCESS_PERM, MD_ACCESS_EXECUTE); set_dword_data(pIMeta, MyHandle, scripts, MD_APP_ISOLATED, IIS_MD_UT_WAM, 2); pIMeta->CloseKey(MyHandle); return 0;}static char *add_resin_filter(CComPtr <IMSAdminBase> pIMeta, TCHAR *name, char *filter_path){ HRESULT hRes = 0; METADATA_HANDLE MyHandle; char data[256]; hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, name, METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); if (FAILED(hRes)) { return "Can't open filter"; } if (get_string(pIMeta, MyHandle, TEXT("/Resin"), IIS_MD_UT_SERVER, MD_KEY_TYPE, data) < 0) { pIMeta->AddKey(MyHandle, TEXT("/Resin")); } set_type(pIMeta, MyHandle, TEXT("/Resin"), "IIsFilter"); set_boolean_data(pIMeta, MyHandle, TEXT("/Resin"), MD_FILTER_ENABLED, IIS_MD_UT_SERVER, 1); set_data(pIMeta, MyHandle, TEXT("/Resin"), MD_FILTER_IMAGE_PATH, IIS_MD_UT_SERVER, filter_path); char filterLoad[1024]; char newFilter[1024]; if (get_string(pIMeta, MyHandle, TEXT("/"), IIS_MD_UT_SERVER, MD_FILTER_LOAD_ORDER, filterLoad) < 0) filterLoad[0] = 0; if (! strstr(filterLoad, "Resin")) { if (! filterLoad[0]) strcpy(newFilter, "Resin"); else { strcpy(newFilter, "Resin,"); strcat(newFilter, filterLoad); } if (! set_data(pIMeta, MyHandle, TEXT("/"), MD_FILTER_LOAD_ORDER, IIS_MD_UT_SERVER, newFilter)) { return "Can't set IIS filter order"; } } pIMeta->CloseKey(MyHandle); return 0;}static char *add_resin_filter_metabase(HWND hDlg, char *filter_path){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; CComPtr <IMSAdminBase> pIMeta; CoInitialize(0); hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void **) &pIMeta); if (FAILED(hRes)) return "Can't open metabase"; char *result = add_resin_filter(pIMeta, TEXT("/LM/W3SVC/Filters"), filter_path); if (! result) return 0; // Try again? result = add_resin_filter(pIMeta, TEXT("/LM/W3SVC/Filters"), filter_path); return result;}static char *add_resin_script_metabase(HWND hDlg, char *script_path){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; CComPtr <IMSAdminBase> pIMeta; CoInitialize(0); hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void **) &pIMeta); if (FAILED(hRes)) return "Can't open metabase"; char *result = add_resin_script(pIMeta, TEXT("/LM/W3SVC/1/ROOT"), script_path); return result;}static char *add_resin_filter_registry(HWND hDlg, char *filter_path){ char buf[1024]; HKEY hKeyParams; buf[0] = 0; if (! (hKeyParams = reg_lookup(HKEY_LOCAL_MACHINE, IIS_PARAM))) return "Can't open IIS Parameters"; reg_query_string(hKeyParams, TEXT("Filter DLLs"), buf); RegCloseKey(hKeyParams); if (strstr("isapi_srun.dll", buf)) return 0; if (buf[0]) strcat(buf, ","); strcat(buf, "isapi_srun.dll"); reg_set_string(IIS_PARAM, "Filter DLLs", buf); return 0;}static char *remove_resin_filter(CComPtr <IMSAdminBase> pIMeta, METADATA_HANDLE MyHandle){ set_dword(pIMeta, MyHandle, TEXT("/Resin"), MD_FILTER_ENABLED, 0); pIMeta->DeleteKey(MyHandle, TEXT("/Resin")); char filterLoad[1024]; if (! get_string(pIMeta, MyHandle, TEXT("/"), IIS_MD_UT_SERVER, MD_FILTER_LOAD_ORDER, filterLoad)) return 0; char *resin = strstr(filterLoad, "Resin"); if (! resin) return 0; char newFilter[1024]; memset(newFilter, 0, sizeof(newFilter)); if (filterLoad != resin) { int i = -1; for (; resin - filterLoad + i >= 0 && (resin[i] == ' ' || resin[i] == ','); i--) { } strncpy(newFilter, filterLoad, resin - filterLoad + i + 1); newFilter[resin - filterLoad + i + 1] = 0; strcat(newFilter, resin + 5); } else { int i; for (i = 5; resin[i] == ' ' || resin[i] == ','; i++) { } strcpy(newFilter, resin + i); } if (! set_data(pIMeta, MyHandle, TEXT("/"), MD_FILTER_LOAD_ORDER, IIS_MD_UT_SERVER, newFilter)) return "Can't set IIS filter order"; return 0;}static char *remove_resin_filter_metabase(HWND hDlg){ HRESULT hRes = 0; DWORD indx = 0; DWORD len = 0; METADATA_HANDLE MyHandle; CComPtr <IMSAdminBase> pIMeta; CoInitialize(0); hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void **) &pIMeta); if (FAILED(hRes)) return "Can't open IIS metabase"; TCHAR *filter; //get a handle to the local machine filter = TEXT("/LM/W3SVC/Filters"); hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, filter, METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); int hasFilter = 0; char *result = 0; if (! FAILED(hRes)) { hasFilter = 1; result = remove_resin_filter(pIMeta, MyHandle); pIMeta->CloseKey(MyHandle); } filter = TEXT("/LM/W3SVC/1/Filters"); hRes = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, filter, METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); if (! FAILED(hRes)) { hasFilter = 1; result = remove_resin_filter(pIMeta, MyHandle); pIMeta->CloseKey(MyHandle); } return 0;}char *remove_iis(HWND hDlg){ char *msg = remove_resin_filter_metabase(hDlg); if (msg) return msg; int is_nt = (GetVersion() & 0x80000000) == 0; if (is_nt) { if (MessageBox(hDlg, TEXT("Do you want to restart IIS?"), TEXT("Restart IIS?"), MB_OKCANCEL) == IDCANCEL) return 0; msg = stop_service(IIS_SERVICE); if (! msg) start_service(IIS_SERVICE); } else { MessageBox(hDlg, TEXT("You will need to restart IIS to remove Resin. You may need to reboot to see the changes."), TEXT("Restart"), MB_OK); } return msg;}static char *copy_filter(HWND hDlg, char *resin_home, char *isapi_script, int *iis_restart, int is_nt){ char src_name[1024]; char dst_name[1024]; FILE *src_file; FILE *dst_file; char buf[1024]; int len; *iis_restart = 0; sprintf(src_name, "%s/win32/isapi_srun.dll", resin_home); sprintf(dst_name, "%s\\isapi_srun.dll", isapi_script); dst_file = fopen(dst_name, "w+b"); if (! dst_file) { if (! is_nt) MessageBox(hDlg, TEXT("You must stop PWS for setup to copy the new iis_srun filter. You may need to press 'Remove', reboot, and then install Resin."), TEXT("Stop PWS"), MB_OK); else if (MessageBox(hDlg, TEXT("Setup needs to stop IIS to copy the ISAPI filter."), TEXT("Stop IIS?"), MB_OKCANCEL) == IDCANCEL) return 0; if (is_nt) { char *msg = stop_service(IIS_SERVICE); if (msg) return msg; *iis_restart = 1; } dst_file = fopen(dst_name, "w+b"); } if (! dst_file) return "Can't create isapi_srun.dll in IIS script directory"; src_file = fopen(src_name, "rb"); if (! src_file) { fclose(dst_file); return "Can't open isapi_srun.dll in RESIN_HOME"; } while ((len = fread(buf, 1, sizeof(buf), src_file)) > 0) { fwrite(buf, 1, len, dst_file); } fclose(src_file); fclose(dst_file); return 0;}char *configure_iis(HWND hDlg, char *resin_home, char *isapi_script){ char filter[1024]; int is_nt = (GetVersion() & 0x80000000) == 0; sprintf(filter, "%s\\isapi_srun.dll", isapi_script); char *metabase_msg = 0; add_resin_script_permission(isapi_script); char *script = add_resin_script_metabase(hDlg, isapi_script); metabase_msg = add_resin_filter_metabase(hDlg, filter); if (metabase_msg) add_resin_filter_registry(hDlg, isapi_script); int iis_restart = 0; char *msg = copy_filter(hDlg, resin_home, isapi_script, &iis_restart, is_nt); if (! is_nt) { } else if (iis_restart) start_service(IIS_SERVICE); else if (! msg) { if (MessageBox(hDlg, TEXT("Do you want to restart IIS to use the new filter?"), TEXT("Restart IIS?"), MB_OKCANCEL) == IDCANCEL) return 0; char *msg = stop_service(IIS_SERVICE); if (! msg) start_service(IIS_SERVICE); } if (! msg) return metabase_msg; else return msg;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -