找回密码
 点一下
查看: 2336|回复: 11

万能的头目 怎样才能加入 神の居城ーヴァルハラ 

[复制链接]
发表于 2010-5-24 13:51:20 | 显示全部楼层 |阅读模式
群似乎就相当于俱乐部。大体上:
艾历自来水公司=灌水俱乐部
最终鬼畜=模型俱乐部
神の居城ーヴァルハラ=编程俱乐部
小宇宙=2D俱乐部?
蔬果地狱=绘图俱乐部?
羊帮=倒塌俱乐部?
隔壁帮=总俱乐部?

上面是引用别人的帖子的.......


需要考试或者什么??????
发表于 2010-5-24 14:05:03 | 显示全部楼层
誰會對這些東西有興趣啊= =
回复

使用道具 举报

 楼主| 发表于 2010-5-24 14:23:05 | 显示全部楼层
galaxy 稍微差点,但是因为它的限制太多了,刚出来的时候自己写了一段代码,加进去地图就不初始化了...实在是郁闷...

不过其它的还勉强....擅长ASM.VC.win32.Driver...最喜欢C语言...


贴一段代码吧...




#include <ntddk.h>
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
#ifndef SetFlag
#define SetFlag(_F,_SF)&#160;&#160;&#160;&#160;&#160;&#160; ((_F) |= (_SF))
#endif
#ifndef ClearFlag
#define ClearFlag(_F,_SF)&#160;&#160;&#160;&#160; ((_F) &= ~(_SF))
#endif
#define CCP_MAX_COM_ID 32
// 过滤设备和真实设备
static PDEVICE_OBJECT s_fltobj[CCP_MAX_COM_ID] = { 0 };
static PDEVICE_OBJECT s_nextobj[CCP_MAX_COM_ID] = { 0 };
// 打开一个端口设备&#160; 输入串口Id和NTSTATUS状态,成功返回 PDEVICE_OBJECT
PDEVICE_OBJECT ccpOpenCom(ULONG id,NTSTATUS *status)
{
&#160;UNICODE_STRING name_str;&#160; //string
&#160;static WCHAR name[32] = { 0 }; //静态数组
&#160;PFILE_OBJECT fileobj = NULL;&#160; //数据结构
&#160;PDEVICE_OBJECT devobj = NULL; //数据结构
&#160;// 输入字符串。 根据ID转换成串口的名字
&#160;memset(name,0,sizeof(WCHAR)*32);
&#160;RtlStringCchPrintfW(
&#160;&#160;name,32,
&#160;&#160;L"\\\\Device\\\\Serial%d",id);&#160;&#160;&#160;&#160; //name = L"\\\\Device\\\\Serial0" or L"\\\\Device\\\\Serial1" .....
&#160;RtlInitUnicodeString(&name_str,name);&#160; //初始化字符串
&#160;// 打开设备对象
&#160;*status = IoGetDeviceObjectPointer(&name_str, FILE_ALL_ACCESS, &fileobj, &devobj);&#160; //get &devobj
&#160;if (*status == STATUS_SUCCESS)
&#160;&#160;ObDereferenceObject(fileobj);&#160; //释放 fileobj
&#160;return devobj;
}
NTSTATUS
ccpAttachDevice(
&#160;&#160;&#160;&#160;PDRIVER_OBJECT driver,
&#160;&#160;&#160;&#160;PDEVICE_OBJECT oldobj,
&#160;&#160;&#160;&#160;PDEVICE_OBJECT *fltobj,
&#160;&#160;&#160;&#160;PDEVICE_OBJECT *next)
{
&#160;NTSTATUS status;
&#160;PDEVICE_OBJECT topdev = NULL;
&#160;// 生成设备,然后绑定之。
&#160;status = IoCreateDevice(driver,&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;0,&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;NULL,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;oldobj->DeviceType,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;0,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;FALSE,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;fltobj);
/*NTSTATUS
&#160; IoCreateDevice(
&#160;&#160;&#160; IN PDRIVER_OBJECT&#160; DriverObject, //DriverEntry中传入
&#160;&#160;&#160; IN ULONG&#160; DeviceExtensionSize,&#160;&#160; //设备扩展大小&#160; 0
&#160;&#160;&#160; IN PUNICODE_STRING&#160; DeviceName&#160; OPTIONAL,&#160; //过滤设备一般没有名称&#160; null&#160;
&#160;&#160;&#160; IN DEVICE_TYPE&#160; DeviceType,&#160;&#160;&#160;&#160;&#160; //设备类型&#160; 应和被绑定的设备类型相同&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160; IN ULONG&#160; DeviceCharacteristics, //设备特征&#160; 0
&#160;&#160;&#160; IN BOOLEAN&#160; Exclusive,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //是否排斥 选择false
&#160;&#160;&#160; OUT PDEVICE_OBJECT&#160; *DeviceObject //生成的新的设备 PDEVICE_OBJECT
&#160;&#160;&#160; );
*/&#160;
&#160;if (status != STATUS_SUCCESS)&#160;&#160;&#160; //如果失败返回错误信息
&#160;&#160;return status;
&#160;// 拷贝重要标志位。
&#160;if(oldobj->Flags & DO_BUFFERED_IO)
&#160;&#160;(*fltobj)->Flags |= DO_BUFFERED_IO;
&#160;if(oldobj->Flags & DO_DIRECT_IO)
&#160;&#160;(*fltobj)->Flags |= DO_DIRECT_IO;
&#160;if(oldobj->Flags & DO_BUFFERED_IO)
&#160;&#160;(*fltobj)->Flags |= DO_BUFFERED_IO;
&#160;if(oldobj->Characteristics & FILE_DEVICE_SECURE_OPEN)
&#160;&#160;(*fltobj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
&#160;(*fltobj)->Flags |=&#160; DO_POWER_PAGABLE;
&#160;// 绑定一个设备到另一个设备上
&#160;topdev = IoAttachDeviceToDeviceStack(*fltobj,oldobj);
&#160;if (topdev == NULL)
&#160;{
&#160;&#160;// 如果绑定失败了,销毁设备,重新来过。
&#160;&#160;IoDeleteDevice(*fltobj);
&#160;&#160;*fltobj = NULL;
&#160;&#160;status = STATUS_UNSUCCESSFUL;&#160;
&#160;&#160;return status; //返回失败状态
&#160;}
&#160;*next = topdev;
&#160;// 设置这个设备已经启动。
&#160;(*fltobj)->Flags = (*fltobj)->Flags & ~DO_DEVICE_INITIALIZING;
&#160;return STATUS_SUCCESS;
}
// 这个函数绑定所有的串口。
void ccpAttachAllComs(PDRIVER_OBJECT driver)
{
&#160;ULONG i;
&#160;PDEVICE_OBJECT com_ob;
&#160;NTSTATUS status;
&#160;for(i = 0;i<CCP_MAX_COM_ID;i++)
&#160;{
&#160;&#160;// 获得object引用。
&#160;&#160;com_ob = ccpOpenCom(i,&status);
&#160;&#160;if(com_ob == NULL)
&#160;&#160;&#160;continue;
&#160;&#160;// 在这里绑定。并不管绑定是否成功。
&#160;&#160;ccpAttachDevice(driver,com_ob,&s_fltobj,&s_nextobj);
&#160;&#160;// 取消object引用。
&#160;}
}
#define&#160; DELAY_ONE_MICROSECOND&#160; (-10)&#160; //微秒
#define&#160; DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)&#160; //毫秒
#define&#160; DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)&#160; //秒
void ccpUnload(PDRIVER_OBJECT drv)
{
&#160;ULONG i;
&#160;LARGE_INTEGER interval;&#160; //大整数
&#160;// 首先解除绑定
&#160;for(i=0;i<CCP_MAX_COM_ID;i++)
&#160;{
&#160;&#160;if(s_nextobj != NULL)
&#160;&#160;&#160;IoDetachDevice(s_nextobj);&#160; //分离真实设备
&#160;}
&#160;// 睡眠5秒。等待所有irp处理结束
&#160;interval.QuadPart = (5*1000 * DELAY_ONE_MILLISECOND);&#160;&#160;
&#160;KeDelayExecutionThread(KernelMode,FALSE,&interval);&#160;&#160; //延迟执行线程
&#160;// 删除这些设备
&#160;for(i=0;i<CCP_MAX_COM_ID;i++)
&#160;{
&#160;&#160;if(s_fltobj != NULL)
&#160;&#160;&#160;IoDeleteDevice(s_fltobj);
&#160;}
}
NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)
{
&#160;&#160;&#160; PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);
&#160;&#160;&#160; NTSTATUS status;
&#160;&#160;&#160; ULONG i,j;
&#160;&#160;&#160; // 首先得知道发送给了哪个设备。设备一共最多CCP_MAX_COM_ID
&#160;&#160;&#160; // 个,是前面的代码保存好的,都在s_fltobj中。
&#160;&#160;&#160; for(i=0;i<CCP_MAX_COM_ID;i++)
&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(s_fltobj == device)
&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 所有电源操作,全部直接放过。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(irpsp->MajorFunction == IRP_MJ_POWER)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 直接发送,然后返回说已经被处理了。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PoStartNextPowerIrp(irp);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IoSkipCurrentIrpStackLocation(irp);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return PoCallDriver(s_nextobj,irp);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 此外我们只过滤写请求。写请求的话,获得缓冲区以及其长度。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 然后打印一下。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(irpsp->MajorFunction == IRP_MJ_WRITE)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 如果是写,先获得长度
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ULONG len = irpsp->Parameters.Write.Length;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 然后获得缓冲区
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PUCHAR buf = NULL;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(irp->MdlAddress != NULL)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf =
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (PUCHAR)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf = (PUCHAR)irp->UserBuffer;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(buf == NULL)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 打印内容
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(j=0;j<len;++j)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DbgPrint("comcap: Send Data: %2x\\r\\n",
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf[j]);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 这些请求直接下发执行即可。我们并不禁止或者改变它。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IoSkipCurrentIrpStackLocation(irp);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return IoCallDriver(s_nextobj,irp);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }
&#160;&#160;&#160; // 如果根本就不在被绑定的设备中,那是有问题的,直接返回参数错误。
&#160;&#160;&#160; irp->IoStatus.Information = 0;
&#160;&#160;&#160; irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
&#160;&#160;&#160; IoCompleteRequest(irp,IO_NO_INCREMENT);
&#160;&#160;&#160; return STATUS_SUCCESS;&#160;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
&#160;&#160;&#160; size_t i;
&#160;&#160;&#160; // 所有的分发函数都设置成一样的。
&#160;&#160;&#160; for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; driver->MajorFunction = ccpDispatch;
&#160;&#160;&#160; }
&#160;&#160;&#160; // 支持动态卸载。
&#160;&#160;&#160; driver->DriverUnload = ccpUnload;
&#160;&#160;&#160; // 绑定所有的串口。
&#160;&#160;&#160; ccpAttachAllComs(driver);
&#160;&#160;&#160; // 直接返回成功即可。
&#160;&#160;&#160; return STATUS_SUCCESS;
}





----------- 帖子于 14:11 更新 --------- 之前内容发布于 14:10 ------------
引用第1楼alexries于2010-05-24 14:05发表的  :
誰會對這些東西有興趣啊= =


错了

即使是玩,也要认认真真的玩....

----------- 帖子于 14:23 更新 --------- 之前内容发布于 14:11 ------------

怎样加入路人呢???
回复

使用道具 举报

发表于 2010-5-25 06:30:23 | 显示全部楼层
申请~~
回复

使用道具 举报

发表于 2010-5-25 16:25:02 | 显示全部楼层
头目表示无能为力
回复

使用道具 举报

 楼主| 发表于 2010-5-25 19:27:41 | 显示全部楼层
引用第4楼割れる心于2010-05-25 16:25发表的  :
头目表示无能为力

哦,不好意思,是不是我的表达有问题呢?

头目或者大家是不是误会我的意思了?


我的意思是光明正大的.又不损毁头目英明神武的.公开的走前门怎样才能加入 神の居城ーヴァルハラ 或者路人呢??

有几句题外话,我这人从来没走过后门,从来也没想过走后门,以后也永远不会走后门.任何事情.....

我做人的原则之一就是不会去追求自己没有能力拥有的东西.任何东西....
回复

使用道具 举报

发表于 2010-5-25 19:36:44 | 显示全部楼层
神の居城ーヴァルハラ 是白银大人的领地

论坛首页>社区应用>群组>加入

之后还需要等白银大人审批……
回复

使用道具 举报

 楼主| 发表于 2010-5-25 19:52:10 | 显示全部楼层
われるこころ??

かなしむなまえ.....


----------- 帖子于 19:45 更新 --------- 之前内容发布于 19:43 ------------
引用第6楼gason于2010-05-25 19:36发表的  :
神の居城ーヴァルハラ 是白银大人的领地

论坛首页>社区应用>群组>加入

之后还需要等白银大人审批……


知道了 谢谢啊....

----------- 帖子于 19:52 更新 --------- 之前内容发布于 19:45 ------------

神の居城ーヴァルハラ 是jass的? 那算了,当我没说...

嘿嘿,我是想加入galaxy的...

不好意思,给大家添麻烦了.....
回复

使用道具 举报

发表于 2010-5-25 21:14:53 | 显示全部楼层
目前完全无法考虑的应该是最终鬼畜,因为管理者只有一个人,那就是灵蛇。
回复

使用道具 举报

发表于 2010-5-26 13:48:10 | 显示全部楼层
这个加不加的没啥意义和关系啊
回复

使用道具 举报

发表于 2010-5-26 14:56:58 | 显示全部楼层
原来是2D俱乐部啊!
回复

使用道具 举报

发表于 2010-5-26 19:38:59 | 显示全部楼层
还是有人中了渣头魔法没有驱散掉。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-3 12:41 , Processed in 0.040650 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表