C 错误DLL(ISAPI筛选器)

C 错误DLL(ISAPI筛选器),c,memory,isapi,C,Memory,Isapi,我写这个ISAPI过滤器是为了重写URL,因为我们有一些网站移动了位置。。。基本上,过滤器会查看推荐人,如果是本地服务器,它会查看请求的URL并将其与完整推荐人进行比较。如果第一条路径相同,则不会执行任何操作,但如果不相同,则会从完整引用者获取第一条路径并将其前置到URL。例如:来自的推荐人的:/Content/imgs/img.jpg将被重写为/wr/Content/imgs/img.jpg 当我查看日志文件时,一切看起来都很好。但是,DLL使用以下信息保持故障:故障应用程序w3wp.exe,

我写这个ISAPI过滤器是为了重写URL,因为我们有一些网站移动了位置。。。基本上,过滤器会查看推荐人,如果是本地服务器,它会查看请求的URL并将其与完整推荐人进行比较。如果第一条路径相同,则不会执行任何操作,但如果不相同,则会从完整引用者获取第一条路径并将其前置到URL。例如:来自的推荐人的:/Content/imgs/img.jpg将被重写为/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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#ifdef_调试
#定义到\u文件//取消注释以使用日志文件
#ifdef到_文件
#定义DEST文件
#定义DebugMsg(x)WriteToFile x;
处理文件;
#定义日志文件“W:\\Temp\\URLRedirector.log”
无效写文件(句柄hFile、char*szFormat,…){
char-szBuf[1024];
德沃德·德沃茨;
va_列表;
va_开始(列表,szFormat);
vsprintf(szBuf、szFormat、list);
hFile=CreateFile(日志文件、通用写入、,
0,空,始终打开\u,
文件\属性\正常,空);
if(hFile!=无效的句柄值){
SetFilePointer(hFile,0,NULL,文件结束);
WriteFile(hFile、szBuf、lstrlen(szBuf)和dwwrited,NULL);
闭合手柄(hFile);
}
va_end(列表);
}
#恩迪夫
#恩迪夫
BOOL-WINAPI\uuustdcall-getfiltervision(HTTP\ufilter\uversion*pVer)
{
/*指定通知的类型和顺序*/
pVer->dwFlags=(SF_通知_顺序|u高| SF_通知_安全_端口| SF_通知_非安全_端口
|SF_NOTIFY_PREPROC_HEADERS|SF_NOTIFY_END_OF_NET_SESSION);
pVer->dwfiltervision=HTTP\u FILTER\u REVISION;
strcpy(pVer->lpszFilterDesc,“URL重定向程序,版本1.0”);
返回TRUE;
}
DWORD WINAPI标准调用HttpFilterProc(HTTP过滤器上下文*pfc,DWORD通知类型,VOID*pvData)
{
CHAR*pPhysPath;
PHTTP_过滤器_URL_映射pURLMap;
PHTTP_过滤器_预加工_标题pHeaderInfo;
CHAR szreferer[255]、szServer[255]、szURL[255]、szNewURL[255];
DWORD dwRSize=sizeof(szreferer);
DWORD dwSSize=sizeof(szServer);
DWORD dwUSize=sizeof(szURL);
int iTmp,iTmp2;
字符*pos,tmp[255],*tmp2;
开关(NotificationType){
案例SF\U通知\U预处理\U标题:
pHeaderInfo=(PHTTP_过滤器_预处理头)pvData;
if(pfc->GetServerVariable(pfc,“HTTP_REFERER”、szreferer和dwRSize))
{
DebugMsg((DEST,
“推荐人:%s\r\n”,szreferer);
if(pfc->GetServerVariable(pfc,“服务器名称”、szServer和dwSSize))
DebugMsg((DEST,
“服务器名称:%s\r\n”,szServer);
如果(pHeaderInfo->GetHeader(pfc,“URL”、szURL和dwUSize))
DebugMsg((DEST,
“URL:%s\r\n”,szURL));
iTmp=strnstr(szreferer,szServer,strlen(szreferer));
如果(iTmp>0)
{
//这是我们自己的服务器。。。
strcpy(tmp、SZreferer+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)
{
//第一个路径不匹配,请创建新URL。。。
strncpy(szNewURL、tmp2、iTmp2-1);
strcat(szNewURL,szURL);
DebugMsg((DEST,
“newURL:%s\r\n”,szNewURL));
pHeaderInfo->SetHeader(pfc,“URL”,szNewURL);
返回SF_状态_请求_处理的_通知;
}
}
}
打破
违约:
打破
}
返回SF_状态_请求_下一个_通知;
}
/*比较两个字符串并返回比较结束位置的简单函数*/
静态int strnstr(const char*string,const char*strCharSet,int n)
{
int len=(strCharSet!=NULL)?((int)strlen(strCharSet)):0;
int-ret,I,J,found;
如果(0==n | | 0==len)
{
返回-1;
}
ret=-1;
发现=0;

对于(I=0;I我知道您在问一个编程问题,但是您可以通过放弃编写ISAPI过滤器来避免整个问题,而是使用现成的通用重写器,如

这是您想要做什么的规则:

RewriteCond %{HTTP_REFERER} ^http://localserver/([^/]+)/etc/etc$
RewriteCond $1              !*1
RewriteRule ^/([^/]+)/([^/]+)\.(jpg|gif|png)$    /*1/$1/$2.$3    [L]

我知道你在问一个编程问题,但是你可以通过放弃编写ISAPI过滤器来避免整个问题,而是使用现成的通用重写器,比如

这是您想要做什么的规则:

RewriteCond %{HTTP_REFERER} ^http://localserver/([^/]+)/etc/etc$
RewriteCond $1              !*1
RewriteRule ^/([^/]+)/([^/]+)\.(jpg|gif|png)$    /*1/$1/$2.$3    [L]

一个潜在问题是
szreferer
szServer
是否完全相同(不确定是否可能)。但如果发生这种情况,则
strnstr
返回字符串值的长度。换句话说,它返回第一个字符串的长度。在这种情况下,strcpy-into
tmp
我认为只在
tmp
中放入一个零终止字节。以下
strhr(tmp+1,“/”);
则具有未定义的行为。从中返回的值可以是任何内容