gpt4 book ai didi

c - 故障 DLL(ISAPI 筛选器)

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:27 24 4
gpt4 key购买 nike

我写了这个 ISAPI 过滤器来重写 URL,因为我们有一些站点移动了位置...基本上过滤器会查看引荐来源网址,如果它是本地服务器,它会查看请求的 URL 并将其与完整的网址进行比较推荐人。如果第一个路径相同,则什么都不做,但如果不相同,它会从完整的引荐来源网址中获取第一个路径并将其添加到 URL 之前。例如:/Content/imgs/img.jpg 来自 http://myserver/wr/apps/default.htm 的引荐来源网址将被重写为/wr/Content/imgs/img.jpg。

当我查看日志文件时,一切看起来都很好。然而,DLL 不断出错,并显示以下信息:错误应用程序 w3wp.exe,版本 6.0.3790.3959,错误模块 URLRedirector.dll,版本 0.0.0.0,错误地址 0x0002df25。

代码如下:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <httpfilt.h>
#include <time.h>
#include <string.h>


#ifdef _DEBUG
#define TO_FILE // uncomment out to use a log file
#ifdef TO_FILE
#define DEST ghFile
#define DebugMsg(x) WriteToFile x;
HANDLE ghFile;
#define LOGFILE "W:\\Temp\\URLRedirector.log"
void WriteToFile (HANDLE hFile, char *szFormat, ...) {
char szBuf[1024];
DWORD dwWritten;
va_list list;
va_start (list, szFormat);
vsprintf (szBuf, szFormat, list);
hFile = CreateFile (LOGFILE, GENERIC_WRITE,
0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
SetFilePointer (hFile, 0, NULL, FILE_END);
WriteFile (hFile, szBuf, lstrlen (szBuf), &dwWritten, NULL);
CloseHandle (hFile);
}
va_end (list);
}
#endif
#endif

BOOL WINAPI __stdcall GetFilterVersion(HTTP_FILTER_VERSION *pVer)
{
/* Specify the types and order of notification */

pVer->dwFlags = (SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
| SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_END_OF_NET_SESSION);

pVer->dwFilterVersion = HTTP_FILTER_REVISION;

strcpy(pVer->lpszFilterDesc, "URL Redirector, Version 1.0");

return TRUE;
}

DWORD WINAPI __stdcall HttpFilterProc(HTTP_FILTER_CONTEXT *pfc, DWORD NotificationType, VOID *pvData)
{
CHAR *pPhysPath;
PHTTP_FILTER_URL_MAP pURLMap;
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo;
CHAR szReferrer[255], szServer[255], szURL[255], szNewURL[255];
DWORD dwRSize = sizeof(szReferrer);
DWORD dwSSize = sizeof(szServer);
DWORD dwUSize = sizeof(szURL);
int iTmp, iTmp2;
CHAR *pos, tmp[255], *tmp2;

switch (NotificationType) {

case SF_NOTIFY_PREPROC_HEADERS :
pHeaderInfo = (PHTTP_FILTER_PREPROC_HEADERS)pvData;

if (pfc->GetServerVariable(pfc, "HTTP_REFERER", szReferrer, &dwRSize))
{
DebugMsg(( DEST,
"Referrer: %s\r\n", szReferrer ));

if (pfc->GetServerVariable(pfc, "SERVER_NAME", szServer, &dwSSize))
DebugMsg(( DEST,
"Server Name: %s\r\n", szServer ));

if (pHeaderInfo->GetHeader(pfc, "URL", szURL, &dwUSize))
DebugMsg(( DEST,
"URL: %s\r\n", szURL ));

iTmp = strnstr(szReferrer, szServer, strlen(szReferrer));
if(iTmp > 0)
{
//Referred is our own server...
strcpy(tmp, szReferrer + iTmp);
DebugMsg(( DEST,
"tmp: %s - %d\r\n", tmp, strlen(tmp) ));
pos = strchr(tmp+1, '/');
DebugMsg(( DEST,
"pos: %s - %d\r\n", pos, strlen(pos) ));

iTmp2 = strlen(tmp) - strlen(pos) + 1;

strncpy(tmp2, tmp, iTmp2);
tmp2[iTmp2] = '\0';
DebugMsg(( DEST,
"tmp2: %s\r\n", tmp2));

if(strncmp(szURL, tmp2, iTmp2) != 0)
{
//First paths don't match, create new URL...
strncpy(szNewURL, tmp2, iTmp2-1);
strcat(szNewURL, szURL);
DebugMsg(( DEST,
"newURL: %s\r\n", szNewURL));
pHeaderInfo->SetHeader(pfc, "URL", szNewURL);
return SF_STATUS_REQ_HANDLED_NOTIFICATION;
}
}
}

break;

default :

break;
}

return SF_STATUS_REQ_NEXT_NOTIFICATION;
}


/* simple function to compare two strings and return the position at which the compare ended */
static int strnstr ( const char *string, const char *strCharSet, int n)
{
int len = (strCharSet != NULL ) ? ((int)strlen(strCharSet )) : 0 ;
int ret, I, J, found;

if ( 0 == n || 0 == len )
{
return -1;
}

ret = -1;
found = 0;
for (I = 0 ; I <= n - len && found != 1 ; I++)
{
J = 0 ;
for ( ; J < len ; J++ )
{
if (toupper(string[I + J]) != toupper(strCharSet [J]))
{
break; // Exit For(J)
}
}

if ( J == len)
{
ret = I + (J);
found = 1;
}
}

return ret;
}

最佳答案

如果您真的想编写和维护自定义 ISAPI 过滤器,我强烈推荐两件事:

  1. 使用 Visual Studio 调试
    .
    如果问题可重现,请使用 Visual Studio 或其他调试器附加到 w3wp.exe 以捕获异常。您需要做的是启动 IIS 并通过它运行请求,以便加载过滤器。确保 DLL 的 pdb 文件与 DLL 位于同一位置。
    .
    然后您需要启动 Visual Studio,然后附加到调试器中的 w3wp.exe 进程。然后运行导致错误的请求。在 Visual Studio 中,调试器将向您显示导致问题的确切行。

  2. 使用 StackWalker
    .
    如果问题不能可靠地重现,您将需要安排记录调用堆栈转储,包括行号,当问题确实发生时,以帮助诊断它。为此使用 codeplex Stackwalker项目。当异常发生时,您的 ISAPI 可以将调用堆栈转储到日志文件中,这样您就可以查明代码中导致错误的行。

关于c - 故障 DLL(ISAPI 筛选器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2436034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com