源码 GetServerVariable
来源(www.asm32.net)
From: http://www.asm32.net/article_disp.asp?ID=1892
下载源文件: i1892_001GetServerVariable.rar
Sambar ISAPI "GetServerVariable.dll"
GetServerVariable.c
#include <windows.h> #include <httpext.h> #include <string.h> #include <stdio.h> //#include <stdarg.h> /* ** Globals */ UINT A_nVariableNameA_Count = 38; CHAR * A_szVariableNameA[38]={"ALL_HTTP", "ALL_RAW", "APPL_MD_PATH", "AUTH_PASSWORD", "AUTH_TYPE", "AUTH_USER", "CERT_COOKIE", "CERT_FLAGS", "CERT_ISSUER", "CERT_KEYSIZE", "CERT_SECRETKEYSIZE", "CERT_SERIALNUMBER", "CERT_SERVER_ISSUER", "CERT_SERVER_SUBJECT", "CERT_SUBJECT", "CONTENT_LENGTH", "CONTENT_TYPE", "HTTP_ACCEPT", "HTTPS", "HTTPS_KEYSIZE", "HTTPS_SECRETKEYSIZE", "HTTPS_SERVER_ISSUER", "HTTPS_SERVER_SUBJECT", "INSTANCE_ID", "INSTANCE_META_PATH", "PATH_INFO", "PATH_TRANSLATED", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_HOST", "REMOTE_USER", "REQUEST_METHOD", "SCRIPT_NAME", "SERVER_PORT", "SERVER_PORT_SECURE", "SERVER_PROTOCOL", "SERVER_SOFTWARE", "URL"}; UINT A_nVariableNameB_Count = 6; CHAR * A_szVariableNameB[6]={ "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_REFERER", "HTTP_USER_AGENT", "HTTP_ACCEPT_ENCODING" }; CHAR * A_szWeekday[7] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; CHAR * A_szNow[6] = {"夜里好", "早上好", "上午好", "中午好", "下午好", "晚上好"}; char szAppTitle[] = "Sambar ISAPI /"GetServerVariable.dll/""; char szResponseHeader_Format[] = "Content-Type: text/html/r/n/r/n" "<html>/r/n" "<meta http-equiv=/"Content-Type/"" " content=/"text/html; charset=gb2312/">/r/n" "<head><title>%s</title></head>/r/n" "<body>/r/n" "<h1>%s</h1>/r/n" "<hr>/r/n" "<P>Begin ...</P>/r/n/r/n"; CHAR szPageEnd[] = "/r/n<P>Done.</p>/r/n/r/n</BODY>/r/n</HTML>/r/n"; CHAR szResponseHeader[256] = {0}; UINT nResponseHeader_Len = 0; void PA_GetDateTime(LPTSTR m_szDateBuff); void PA_InitializeDLL(); void PA_WriteClient(EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR m_strInfo); BOOL WINAPI DllMain(IN HINSTANCE hinstDll, IN DWORD dwReason, IN LPVOID lpvContext){ // Note that appropriate initialization and termination code // would usually be written within the switch statement below. But because // this example is very simple, no initialization and termination code is needed. switch(dwReason) { case DLL_PROCESS_ATTACH : PA_InitializeDLL(); break; case DLL_PROCESS_DETACH : break; } return TRUE; } /* ** GetExtensionVersion ** ** ISAPI/Win32 API method to ensure compatibility with the Server. */ BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer) { pVer->dwExtensionVersion = MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR); lstrcpyn(pVer->lpszExtensionDesc, "Sambar Server ISAPI Search extension.", HSE_MAX_EXT_DLL_NAME_LEN); return TRUE; } /* ** HttpExtensionProc ** ** Called in response to the client request. */ DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) { CHAR szDateTimeBuffer[128] = {0}; CHAR buffer[2048]; int buflen=0; UINT i=0; if (!pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, "200 OK", &nResponseHeader_Len, (LPDWORD)szResponseHeader)) { pECB->dwHttpStatusCode = 500; return HSE_STATUS_ERROR; } PA_GetDateTime(szDateTimeBuffer); sprintf(buffer, "<p><strong>welcome:</strong> %s<br>/r/n", szDateTimeBuffer); PA_WriteClient(pECB, buffer); PA_WriteClient(pECB, "<p>The GetServerVariable function retrieves information about a connection or about the IIS itself.</p>/r/n/r/n"); PA_WriteClient(pECB, "<table border=/"1/" style=/"BORDER-COLLAPSE: collapse/" " "width=/"100%/" cellspacing=/"0/" cellpadding=/"5/" borderColor=/"#006699/"" " class=/"ArticleText/">/r/n"); PA_WriteClient(pECB, " <tr>/r/n"); PA_WriteClient(pECB, " <th align=/"left/" width=/"200/">ServerVariableName</th>/r/n"); PA_WriteClient(pECB, " <th align=/"left/">ServerVariableValue</th>/r/n"); PA_WriteClient(pECB, " </tr>/r/n"); for(i=0; i<A_nVariableNameA_Count; i++){ PA_WriteClient(pECB, " <tr>/r/n"); wsprintf(buffer, " <td>%s</td>/r/n", A_szVariableNameA[i]); PA_WriteClient(pECB, buffer); PA_WriteClient(pECB, " <td>"); buflen = sizeof(buffer); memset(buffer, 0, buflen); pECB->GetServerVariable(pECB->ConnID, A_szVariableNameA[i], buffer, &buflen); PA_WriteClient(pECB, buffer); PA_WriteClient(pECB, "</td>/r/n"); PA_WriteClient(pECB, " </tr>/r/n"); } PA_WriteClient(pECB, " <tr>/r/n"); PA_WriteClient(pECB, " <td>-</td>/r/n"); PA_WriteClient(pECB, " <td>-</td>/r/n"); PA_WriteClient(pECB, " </tr>/r/n"); for(i=0; i<A_nVariableNameB_Count; i++){ PA_WriteClient(pECB, " <tr>/r/n"); wsprintf(buffer, " <td>%s</td>/r/n", A_szVariableNameB[i]); PA_WriteClient(pECB, buffer); PA_WriteClient(pECB, " <td>"); buflen = sizeof(buffer); memset(buffer, 0, buflen); pECB->GetServerVariable(pECB->ConnID, A_szVariableNameB[i], buffer, &buflen); PA_WriteClient(pECB, buffer); PA_WriteClient(pECB, "</td>/r/n"); PA_WriteClient(pECB, " </tr>/r/n"); } PA_WriteClient(pECB, "</table>/r/n"); PA_WriteClient(pECB, szPageEnd); pECB->dwHttpStatusCode = 200; return HSE_STATUS_SUCCESS; } void PA_WriteClient(EXTENSION_CONTROL_BLOCK *pECB, LPCTSTR m_strInfo){ DWORD m_dwInfoLen = strlen(m_strInfo); pECB->WriteClient(pECB->ConnID, (LPVOID)m_strInfo, &m_dwInfoLen, 0); } void PA_InitializeDLL(){ wsprintf(szResponseHeader, szResponseHeader_Format, szAppTitle, szAppTitle); nResponseHeader_Len = strlen(szResponseHeader); } void PA_GetDateTime(LPTSTR m_szDateBuff){ SYSTEMTIME m_tmSystemTime; char * m_szNow; int m_nHour =0; GetLocalTime(&m_tmSystemTime); m_nHour = m_tmSystemTime.wHour; if( m_nHour>=0 && m_nHour<4 ) m_szNow = A_szNow[0]; if( m_nHour>=4 && m_nHour<9 ) m_szNow = A_szNow[1]; if( m_nHour>=9 && m_nHour<12 ) m_szNow = A_szNow[2]; if( m_nHour>=12 && m_nHour<14 ) m_szNow = A_szNow[3]; if( m_nHour>=14 && m_nHour<18 ) m_szNow = A_szNow[4]; if( m_nHour>=18 && m_nHour<24 ) m_szNow = A_szNow[5]; // "2005-05-02 12:27:30 星期三 下午好"; sprintf(m_szDateBuff, "%04d年%02d月%02d日 %02d:%02d:%02d %s %s", m_tmSystemTime.wYear, m_tmSystemTime.wMonth, m_tmSystemTime.wDay, m_tmSystemTime.wHour, m_tmSystemTime.wMinute, m_tmSystemTime.wSecond, A_szWeekday[m_tmSystemTime.wDayOfWeek], m_szNow); } |
GetServerVariable.def
; GetServerVariable.def : Declares the module parameters for the DLL. LIBRARY "GetServerVariable" DESCRIPTION 'GetServerVariable Windows Dynamic Link Library' EXPORTS GetExtensionVersion HttpExtensionProc ; Explicit exports can go here |
GetServerVariable.dsp
# Microsoft Developer Studio Project File - Name="GetServerVariable" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=GetServerVariable - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "GetServerVariable.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "GetServerVariable.mak" CFG="GetServerVariable - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "GetServerVariable - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "GetServerVariable - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "GetServerVariable - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GETSERVERVARIABLE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GETSERVERVARIABLE_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x804 /d "NDEBUG" # ADD RSC /l 0x804 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"GetServerVariable.dll" !ELSEIF "$(CFG)" == "GetServerVariable - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GETSERVERVARIABLE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GETSERVERVARIABLE_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x804 /d "_DEBUG" # ADD RSC /l 0x804 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "GetServerVariable - Win32 Release" # Name "GetServerVariable - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=./GetServerVariable.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=./GetServerVariable.def # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project |
运行结果:
Sambar ISAPI "GetServerVariable.dll"Begin ... welcome: 2006年08月24日 06:03:07 星期四 早上好 The GetServerVariable function retrieves information about a connection or about the IIS itself.
Done. |
Link: http://www.asm32.net/article_disp.asp?ID=1892