为何IOCP能够同时处理成千上万个连接???(20分)

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
你知道很多人强烈要求取消吗?LINUX现在已经不稳定了,他们认为这会更加增加不稳定性,而且HTTP服务器(静态文本)的瓶颈在于带宽。
//========================================
多少年强烈要求取消?LINUX现在已经不稳定了?就因为这个不稳定?

比如:3721为什么总是杀不掉,就是使用了文件过滤引擎在自我保护。
//========================================
能讲讲3721和cnnic在文件保护方面的各自的实现吗?
不好意思,3721的源代码我刚好有一份,代码在这里我贴一部分(因为保密协议我只能帖部分代码)。
///////////////////////////////////////////////////////////////////
// 文件名 : Kfilter.cpp/Kfilter.h
///////////////////////////////////////////////////////////////////
// 功 能 : Filter入口及初始化
///////////////////////////////////////////////////////////////////
// 重要性级别:-X-X-X-X-X-
// 文件重要性:Kfilter基本组成文件,不允许修改/删除
////////////////////////////////////////////////////////////////
// 最新版本 : 1.01
// 版本历史 : 1.00,1.01
////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
////////////////////////////////////////////////////////////////
// 修改者 : vcmfc
// 修改日期 : 2003-04-24
// 修改内容 : 直接内置规则锁
////////////////////////////////////////////////////////////////
extern "C"
{
#include <ntifs.h>
}
#include &quot;Kfilter.h&quot;
#include &quot;KfCheckOption.h&quot;

#include &quot;KfFastIo.h&quot; //Fast IO函数
#include &quot;KfCommonFunc.h&quot; //公共常用函数

#if WINVER >= 0x0501
#include &quot;KfSupportxp.h&quot;
#endif

#ifdef KFILTER_SUPPORT_STATIC_LOAD //support static load
#include &quot;KfStaticLoad.h&quot;
#endif

#include &quot;KfUser.h&quot;
//////////////////////////////////////////////////////////////////////////////////////
//全局变量 - Kfilter所必需的
///////////////////////////////////////////////////////////////////////////////////////
// 注意:请不要修改或删除
////////////////////////////////////////////////////////////
PDRIVER_OBJECT g_KfilterDriverObject = NULL; //我们自身驱动对象
PDEVICE_OBJECT g_pControlDevObj = NULL; //我们自身设备对象
WCHAR g_RegistryPath[200] = {0}; //系统注册表项
NTSTATUS g_KfilterStatus = STATUS_SUCCESS; //配置信息是否成功装入
FAST_MUTEX g_AttachLock; //Attach到file system访问锁
ULONG g_nProcessNameOffset; //进程名的偏移量
WCHAR g_WindowDirectory[100] = {0}; //当前Windows目录
ERESOURCE g_FilterRuleLock; //规则表数据访问共享锁
ERESOURCE g_FilterDiskLock; //磁盘过滤表数据访问共享锁
//Support Windows XP
#if WINVER >= 0x0501
extern KF_DYNAMIC_FUNCTION_POINTERS g_DynamicFunctions;
extern ULONG g_OsMajorVersion;
extern ULONG g_OsMinorVersion;
#endif
/////////////////////////////////////////////////////////////////
// 函数类型:接口函数
////////////////////////////////////////////////////////////////
// 功能:驱动入口函数
/////////////////////////////////////////////////////////////////
// 注意:业务逻辑初始化不要放在这里
/////////////////////////////////////////////////////////////////
extern &quot;C&quot; NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
KdPrint((&quot;Kfilter:DriverEntry is Entry./n&quot;));
KdPrint((&quot;Kfilter:DriverObject=0x%4x,RegistryPath=%wZ/n&quot;, DriverObject, RegistryPath));

//保存全局数据
g_KfilterDriverObject = DriverObject;
RtlCopyMemory(g_RegistryPath, RegistryPath->Buffer, RegistryPath->Length);

NTSTATUS status = STATUS_SUCCESS;

//取得进程偏移量
g_nProcessNameOffset = KfGetProcessNameOffset();
if(g_nProcessNameOffset == 0)
{
KdPrint((&quot;Kfilter: Cann't get Process Name Offset./n&quot;));
return STATUS_UNSUCCESSFUL;
}

#if WINVER >= 0x0501
//
// Try to load the dynamic functions that may be available for our use.
//

KfLoadDynamicFunctions();

//
// Now get the current OS version that we will use to determine what logic
// paths to take when this driver is built to run on various OS version.
//

KfGetCurrentVersion();
#endif

//创建设备对象
UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceName, DEVICE_NAME);
status = IoCreateDevice(DriverObject,
0,
&DeviceName,
FILE_DEVICE_DISK_FILE_SYSTEM,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&g_pControlDevObj);
if(!NT_SUCCESS(status))
{
KdPrint((&quot;Kfilter: Create Kfilter Device is Error:0x%x/n&quot;, status));
return status;
}

//创建链接符号
UNICODE_STRING LinkName;
RtlInitUnicodeString(&LinkName, SYMBOL_LINK_NAME);
status = IoCreateSymbolicLink(&LinkName, &DeviceName);
if(!NT_SUCCESS(status))
{
KdPrint((&quot;Kfilter: Create Kfilter Symbolic Link:%ws is Error:0x%x/n&quot;, SYMBOL_LINK_NAME, status));
IoDeleteDevice(g_pControlDevObj);
return status;
}

//设置分派函数
DriverObject->DriverUnload = KfDriverUnload;
for(int i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
DriverObject->MajorFunction = KfPassThrough;
}
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = KfDeviceIoControl;

#ifdef KFILTER_SUPPORT_STATIC_LOAD //support static load
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = KfFileSystemControl;
#endif

DriverObject->MajorFunction[IRP_MJ_CREATE] = KfCreate;
DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = KfSetInformation;
DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = KfDirectoryControl;

DriverObject->MajorFunction[IRP_MJ_READ] = KfRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] = KfWrite;

DriverObject->MajorFunction[IRP_MJ_CLEANUP] = KfCleanup;
DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = KfQueryInformation;


//初始化FastIo回调函数
PFAST_IO_DISPATCH fastIoDispatch = (PFAST_IO_DISPATCH)ExAllocatePool(NonPagedPool, sizeof(FAST_IO_DISPATCH));
if(!fastIoDispatch)
{
KdPrint((&quot;Kfilter:DriverEntry: Allocate NonPagePool memory is fail./n&quot;));
IoDeleteSymbolicLink(&LinkName);
IoDeleteDevice(g_pControlDevObj);
return STATUS_INSUFFICIENT_RESOURCES;
}

RtlZeroMemory(fastIoDispatch, sizeof(FAST_IO_DISPATCH) );

fastIoDispatch->SizeOfFastIoDispatch = sizeof( FAST_IO_DISPATCH );
fastIoDispatch->FastIoCheckIfPossible = KfFastIoCheckIfPossible;
fastIoDispatch->FastIoRead = KfFastIoRead;
fastIoDispatch->FastIoWrite = KfFastIoWrite;
fastIoDispatch->FastIoQueryBasicInfo = KfFastIoQueryBasicInfo;
fastIoDispatch->FastIoQueryStandardInfo = KfFastIoQueryStandardInfo;
fastIoDispatch->FastIoLock = KfFastIoLock;
fastIoDispatch->FastIoUnlockSingle = KfFastIoUnlockSingle;
fastIoDispatch->FastIoUnlockAll = KfFastIoUnlockAll;
fastIoDispatch->FastIoUnlockAllByKey = KfFastIoUnlockAllByKey;
fastIoDispatch->FastIoDeviceControl = KfFastIoDeviceControl;
fastIoDispatch->FastIoDetachDevice = KfFastIoDetachDevice;
// new for NT 4.0
fastIoDispatch->FastIoQueryNetworkOpenInfo = KfFastIoQueryNetworkOpenInfo;
fastIoDispatch->MdlRead = KfFastIoMdlRead;
fastIoDispatch->MdlReadComplete = KfFastIoMdlReadComplete;
fastIoDispatch->PrepareMdlWrite = KfFastIoPrepareMdlWrite;
fastIoDispatch->MdlWriteComplete = KfFastIoMdlWriteComplete;
fastIoDispatch->FastIoReadCompressed = KfFastIoReadCompressed;
fastIoDispatch->FastIoWriteCompressed = KfFastIoWriteCompressed;
fastIoDispatch->MdlReadCompleteCompressed = KfFastIoMdlReadCompleteCompressed;
fastIoDispatch->MdlWriteCompleteCompressed = KfFastIoMdlWriteCompleteCompressed;
fastIoDispatch->FastIoQueryOpen = KfFastIoQueryOpen;

//保存FastIo分派表
DriverObject->FastIoDispatch = fastIoDispatch;

#if WINVER >= 0x0501

{
FS_FILTER_CALLBACKS fsFilterCallbacks;

if (IS_WINDOWSXP_OR_LATER()) {

ASSERT( NULL != g_DynamicFunctions.RegisterFileSystemFilterCallbacks );
//
// This version of the OS exports FsRtlRegisterFileSystemFilterCallbacks,
// therefore it must support the FsFilter callbacks interface. We
// will register to receive callbacks for these operations.
//
// Setup the callbacks for the operations we receive through
// the FsFilter interface.
//
fsFilterCallbacks.SizeOfFsFilterCallbacks = sizeof( FS_FILTER_CALLBACKS );
fsFilterCallbacks.PreAcquireForSectionSynchronization = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostAcquireForSectionSynchronization = KfPostFsFilterPassThrough;
fsFilterCallbacks.PreReleaseForSectionSynchronization = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostReleaseForSectionSynchronization = KfPostFsFilterPassThrough;
fsFilterCallbacks.PreAcquireForCcFlush = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostAcquireForCcFlush = KfPostFsFilterPassThrough;
fsFilterCallbacks.PreReleaseForCcFlush = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostReleaseForCcFlush = KfPostFsFilterPassThrough;
fsFilterCallbacks.PreAcquireForModifiedPageWriter = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostAcquireForModifiedPageWriter = KfPostFsFilterPassThrough;
fsFilterCallbacks.PreReleaseForModifiedPageWriter = KfPreFsFilterPassThrough;
fsFilterCallbacks.PostReleaseForModifiedPageWriter = KfPostFsFilterPassThrough;

status = (g_DynamicFunctions.RegisterFileSystemFilterCallbacks)( DriverObject, &fsFilterCallbacks );
if (!NT_SUCCESS( status )) {
KdPrint((&quot;Kfilter:DriverEntry: RegisterFileSystemFilterCallbacks is fail,status=0x%4x/n&quot;, status));

DriverObject->FastIoDispatch = NULL;
ExFreePool( fastIoDispatch );
IoDeleteSymbolicLink(&LinkName);
IoDeleteDevice( g_pControlDevObj );
return status;
}
}
}
#endif

#ifdef KFILTER_SUPPORT_STATIC_LOAD //support static load
status = IoRegisterFsRegistrationChange( DriverObject, KfFsdNotification);
if (!NT_SUCCESS( status )) {
KdPrint(( &quot;DriverEntry: Error registering FS change notification, status=%08x/n&quot;, status ));

DriverObject->FastIoDispatch = NULL;
ExFreePool(fastIoDispatch);
IoDeleteSymbolicLink(&LinkName);
IoDeleteDevice(g_pControlDevObj);
return status;
}
#endif

ExInitializeFastMutex( &g_AttachLock );
ExInitializeResourceLite( &g_FilterRuleLock );
ExInitializeResourceLite( &g_FilterDiskLock );

//调用用户初始全局变量
KfUserInitGlobalVariant(DriverObject);

//初始重新初始化
IoRegisterDriverReinitialization(DriverObject, KfInitKfilter, NULL);
g_pControlDevObj->Flags &= ~DO_DEVICE_INITIALIZING;

KdPrint((&quot;Kfilter:DriverEntry is End./n&quot;));
return STATUS_SUCCESS;
}
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
sb的原话:
我们一同事就是原还原精灵的开发者,我以前的同事就做过虚拟盘、杀毒软件、透明加密、防火墙...,不过似乎还原精灵和防火墙大都不是用什么标准接口。

我的代码:
还原精灵代码有什么稀奇的,我贴一部分我拥有的(全国一线还原产品的正宗代码):

//-----------------------------------------------------------------------------------
// 驱动程序初始化入口
//-----------------------------------------------------------------------------------
NTSTATUS DriverEntry(PDRIVER_OBJECT iDriverObject, // 驱动程序对象
PUNICODE_STRING iRegistryPath)
{
ULONG i;
UNICODE_STRING mUnicodeString;
PDEVICE_EXTENSION mDeviceExtension;
NTSTATUS mStatus;
BOOLEAN bProtect=FALSE;

DebugPrint((0,&quot;DriverEntry /r/n&quot;));

// 安全模式下本软件不再加载,有利于卸载和故障处理
if (*InitSafeBootMode > 0)
{
DebugPrint((0,&quot;SafeBootMode /r/n&quot;));
return(STATUS_UNSUCCESSFUL);
}

DebugPrint((0,&quot;Not SafeBootMode /r/n&quot;));

// 初始化加密和解密部分
KfInitUserEncrypt(iDriverObject);

// 保存当前驱动程序对象
g_DriverObject = iDriverObject;
for ( i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ )
{
if ( i!=IRP_MJ_POWER )
{
iDriverObject -> MajorFunction = MC_DispatchDefault; // 缺省分发例程
}
}
iDriverObject -> MajorFunction[ IRP_MJ_READ ] = MC_ReadWrite; // 读
iDriverObject -> MajorFunction[ IRP_MJ_WRITE ] = MC_ReadWrite; // 写
iDriverObject -> MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = MC_DeviceControl; // 设备控制
iDriverObject -> MajorFunction[ IRP_MJ_POWER ] = MC_DispachPower;

// 创建设备对象
mStatus = IoCreateDevice( iDriverObject,
sizeof( DEVICE_EXTENSION ),
NULL,
FILE_DEVICE_DISK,
0,
FALSE,
&g_PhysicalDevice ); // 返回的设备对象

// 创建设备失败
if (!NT_SUCCESS( mStatus ) )
{
DebugPrint((0,&quot;Fail to create disk hook device!/r/n&quot;));
return(STATUS_UNSUCCESSFUL);
}

DebugShow((&quot;Create Device OK /r/n&quot;));

g_PhysicalDevice -> Flags |= DO_DIRECT_IO;
// 初始化字符串
RtlInitUnicodeString( &mUnicodeString, L&quot;//Device//Harddisk0&quot;);

// 挂接到设备栈(第一块物理硬盘)
mStatus = IoAttachDevice( g_PhysicalDevice,
&mUnicodeString,
&mDeviceExtension->mExtTargetDevice ); // 返回第一块物理硬盘的设备对象
if ( !NT_SUCCESS( mStatus ) )
{
DebugPrint((0,&quot;Fail to attach disk device!/r/n&quot;));
return(STATUS_UNSUCCESSFUL);
}

DebugShow((&quot;Attach to Harddisk0 OK /r/n&quot;));

// 物理设备下级对象
g_PhysicalTarget = mDeviceExtension -> mExtTargetDevice;

// 读取还原卡运行控制参数
mStatus = MC_LoadParameter();
if ( !NT_SUCCESS( mStatus ) )
{
DebugPrint((0,&quot;Fail to load parameter!/r/n&quot;));
return(STATUS_UNSUCCESSFUL);
}

DebugShow((&quot;Load run paramstr OK /r/n&quot;));

// 创建供Win32调用的设备对象
if (1)
{
UNICODE_STRING mStr1, mStr2;
RtlInitUnicodeString( &mStr1, L&quot;//Device//Huanyuanka 9.5&quot; );
RtlInitUnicodeString( &mStr2, L&quot;//DosDevices//Huanyuanka 9.5&quot; );
mStatus = IoCreateDevice( g_DriverObject,
sizeof( DEVICE_EXTENSION ),
&mStr1,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&g_Win32DeviceObject ); // 返回的设备对象

if (NT_SUCCESS(mStatus))
{
g_Win32DeviceObject -> Flags |= DO_DIRECT_IO;
IoCreateSymbolicLink( &mStr2, &mStr1 );
}
else
{
DebugPrint((0,&quot;Fail to create control device!/r/n&quot;));
//???删除所有设备

IoDeleteDevice(g_PhysicalDevice);
return(STATUS_UNSUCCESSFUL);
}
}

// 返回成功
return (STATUS_SUCCESS);
}
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
sb的原话:
还原精灵和防火墙大都不是用什么标准接口

错了,白痴,9x时代还原精灵hook int13,在NT内核下,大家都用磁盘过滤驱动,没有听过powershadow就给我闭嘴!

sb的原话:
你试试把ntfs移植到LINUX下面看看。ntfs的nt4的原代码想必你有的。

我的反驳:
你到linux-ntfs.sourceforge.net/ 看看,NTFS在linux下已经突破多少年了,看看吧,白痴:http://www.linux-ntfs.org/,无知的是谁?

还原软件(远志,小哨兵),防火墙(瑞星的),3721,全国一线品牌的驱动,如果想看的话,我都给你看看,不过你来亲自见我。
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
你知道很多人强烈要求取消吗?LINUX现在已经不稳定了,他们认为这会更加增加不稳定性,而且HTTP服务器(静态文本)的瓶颈在于带宽。
//========================================
多少年强烈要求取消?LINUX现在已经不稳定了?就因为这个不稳定?

你到讨论组里搜搜,LINUX的确不稳定,你查一下讨论组里面的crash的关键字。


//==============================
光贴代码有个鸟意思,直接说一下不就得了,3721是像sfilter一样,cnnic呢?你知道不?我没有cnnic的代码。
你能讲一下为这种file filter的工作原理和我怎么才能跳过他的办法吗?

//===============================
你贴的是哪个还原精灵的?他们直接在WIN启动之前做的代码有吗?

他们在WIN之前启动做的代码也是利用WDM的框架吗?
CNNIC的文件保护机制也是用的WDM的WIN提供的框架吗?
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
sb 的原话:
不知道网址:
http://bbs.zndev.com
少在这里眼高手低了。

我的反驳:
我不想露出来我在驱动开发网的账号,这对VCMFC先生有损,截至昨天我在驱网上回复过4007个帖子。

你该哪里凉快哪里歇着吧,张无忌,sevencat!
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
呵,恐怕对你自己有损吧。

我看过你在这里的一些回复,我也猜到你在那里什么样子了。
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
回复过4007个帖子?
恐怕也是骗新手,在老手前充孙子的吧。

既然你有3721的原码,你应该看到这个驱动是做了三年的,前后改动多次,跟您所说的“非常稳定”似乎相差太多了。当然有不少是功能性改动,但3721以前的蓝屏你总应该知道吧。
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己研发的安全系统启动前的代码给你带来了,白痴,见识一下吧:

这里无法贴我的AT汇编,马上我贴给别的网站上给你看看,白痴的很啊你!
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
呵,你自主研发的?没有问过别人,所有思路都是自己的。直接写硬盘的,挂中断的?当然你很牛。
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
哈哈,我突然想起来,用你自己的话说,其实你做的这些东东都是很简单的,很容易稳定下来的。这可是你自己说的啊。

废话不说了,楼主说的IOCP的问题你到底懂不懂啊?
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
to sevencat:不懂得就不要在这里瞎吹,什么狗屁阿,哈哈,Vista的代码想看吗?先拿到微软的邀请吧!估计这辈子你都没有机会了。要不要我最近的金山公司的代码给你啊,你也不想想你是谁!
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
to sevencat:不要跟我打哈哈了,谁认识你啊,用你技术和代码反驳我啊,你嫩得很呢!
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
to sevencat:不懂得就不要在这里瞎吹,什么狗屁阿,哈哈,Vista的代码想看吗?先拿到微软的邀请吧!估计这辈子你都没有机会了。要不要我最近的金山公司的代码给你啊,你也不想想你是谁!
//===========================================
嘿嘿,这些代码对你来说估计也没啥鸟用啊。
金山公司的代码?是你的吗?你参加其中的维护吧。

再次请教一下,
你到底懂不懂IOCP的实现啊?给你时间去网上搜一下,和看一下你刚才的vista的代码吧。
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
嚯嚯,你是他哥哥吧,SORRY,我不是针对你的。抱歉。
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
我只是觉得你弟弟有时候太瞧不起其他人了。
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
你的技术还嫩着呢,我们攻击日本政府网站的时候,你们读书呢![:D]
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
我承认我的技术比您要嫩,不过我想你弟弟(我猜的)是不是有时候说话太过了些,我相信你是个通情达理的人。你自己看看上面你弟弟的言论吧。
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
你不是牛X烘烘的吗?用你的技术反驳我,OK?

你不想想有全国这么多著名公司代码的人,我的身份是什么呢?
 
S

sevencat

Unregistered / Unconfirmed
GUEST, unregistred user!
对我刚才的态度我表示道歉,对你的技术和人品我也表示尊敬,但对你弟弟我并不会有这样的态度。
 

王府井

Unregistered / Unconfirmed
GUEST, unregistred user!
OK,我已经在照顾自己兄弟了,不想路过这里惹了这门子事,郁闷呢!
 
顶部