Recent Posts

 
27Nov

sfilter动态加解密总结

为了后来者不再晕,总结如下:

转载

1.加密在SfWrite(IRP_MJ_WRITE)中,而不是完成例程,
解密在SfRead(IRP_MJ_READ)中,而不是完成例程,

3.只要处理IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO

2.加密简单过程:
a.得到Windows传下来的Buffer Address,
if (Irp->MdlAddress)
{
SysDataBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
}
else
{
SysDataBuf = Irp->UserBuffer;
}
b.保存明文SysDataBuf 在SysDataBufFirst

c.用你强大的算法加密SysDataBuf –>> MyBuf

d.把MyBuf Copy到 SysDataBuf,

e.IoCallDriver 把密文向下传,写入HardDisk。

f.恢复内存的明文 RtlCopyMemory(SysDataBuf,SysDataBufFirst, ulWriteLen);.

3.解密的大致过程:
a.IoCallDriver 读到密文
b,解密
c。IoCompleteRequest 搞定

我的开发环境:
IFS2600,SFilter的代码却是for XP SP1的

再仍一块砖头:
如何从IrpStackLocation中判断来自网络的文件访问?

//—————————————————
NTSTATUS status;

PACCESS_TOKEN pToken = NULL;
PTOKEN_SOURCE pTokenSrc = NULL ;
PSECURITY_SUBJECT_CONTEXT secSubCtx;

secSubCtx = &(IrpSp->Parameters.create.SecurityContext->AccessState->SubjectSecurityContext);

if (secSubCtx->ClientToken != NULL || secSubCtx->PrimaryToken != NULL)
{
pToken = SeQuerySubjectContextToken(secSubCtx);
}

if (pToken == NULL)
{
//KdPrint((”SeQuerySubjectContextToken Errorn”));
return 0
}

//
// Get TokenSource Name If SourceName is “NtLmSsp” it was logged-in via Lanmanager,
// “User32″ represents localy logged-in users.
//
__try
{

status = SeQueryInformationToken(pToken,TokenSource,&pTokenSrc);

if (NT_SUCCESS(status))
{
pTokenSrc->SourceName[TOKEN_SOURCE_LENGTH-1] = 0×00;

KdPrint((”Token Name :%s Len:%dn”,pTokenSrc->SourceName,strlen(pTokenSrc->SourceName)));

if (_stricmp(pTokenSrc->SourceName,”NtLmSsp”) == 0 )
{
KdPrint((”NetWork Access Token Findn”));
return 123
}

}
else
{
KdPrint((”SeQueryInformationToken Error:0x%xn”,status));
}
}
__finally
{
ExFreePool(pTokenSrc);
}

return 0

22Nov

术业有专攻

韩愈“术业有专攻”一语,广为人们所接受。庄子有言:“人生也有涯,而知也无涯,以有涯随无涯,殆矣!”事实确是如此。套用哲学家的话说,就是要有所为,有所不为;有所不为才能有所为。如果说,在知识相对单一、集中而以人文学科为主的古人那里,想做一个上知天文、下知地理的通人已非常困难,那么,到了学科种类
日趋繁杂、各种信息空前爆炸的今天,要想将所有知识兼容并包,就无异于痴人说梦了。从这点来说,术有专攻是必需的,这既是学科划分越来越细密而形成的一个必然结果,也是人类社会发展和社会分工对人们研究范围给出的一个合理的限定。

  所谓术有专攻,就是强调每个人都应有自己的专业方向,都应在专业方向的范围内将学问做深做精,成为该方面的行家里手。这样做的好处,一是可以节约时间,将有限的精力集中起来使用,避免无谓的消耗;二是可以减少信息收集和处理的工作量,在单位时间里将有关研究对象的资料予以竭泽而渔式的收罗,达到精而全的地步;三是易于出成果,成专家。就做学问而言,术有专攻是避免浮躁与空泛的重要手段。什么都学,什么都不精通,既非专才,也非通才,这种万金油式的人已不被看好。

  然而,如果将术有专攻强调得过了头,一切惟专是从,那么,其弊端也是明显的。

  首先,它易于限制人们的学术视野。中国传统思惟重视联系,很少孤立地去看待事物;中国学术向来文史哲不分家,主张不同学科的交融贯通。时至今日,学术已成为一个不同学科间互有关联互有借鉴的大的共同体。一些思想的火花、灵感,有时就是由不同学科间的对话、碰撞而被激活的;不少新发现和原创性成果,便是通过边缘学科研究、跨学科研究产生的。所以,只有扩大视野,才能具有登高纵览的大气象,才易于做出新学问、大学问。否则,学术视线便容易被自己的“术业”所限制,只见树木,不见森林。仅在自家的一亩三分地里打转转,便难得具备宏通的眼光和识断,也就难以避免井蛙之讥。

  其次,过早地进入某一专业领域,而又只能入不能出,易于造成知识结构的单一化、狭隘化,最终导致一种能力的发展和多种能力的丧失。进入现代社会以后,由于学科越分越细,以致不同学科间形同陌路;即使同属一个学科,由于研究时段和对象的不同,也很少互通音问,从而人为地阻隔了学科间通话的渠道,形成一个个大大小小的“术业”的独立王国。学术研究如果缺少宏阔的视野,缺少多层面、大跨度的知识积累,便只能使学者变得知识越来越精而知识面越来越窄,对少数问题所知甚深而对多数问题所知甚少。这不利于学术研究的发现和创新,不利于学术本身的繁衍发展。

  其三,与第二点相联系,狭隘、单一的知识结构会使得研究者缺乏后劲,以致研究到了一定程度,便难于向广度拓展,向深度掘进。《庄子·外物》载惠施批评庄子说:“子言无用。”庄子答曰:“知无用而始可与言用矣。天地非不广且大也,人之所用容足耳,然则厕足而垫之致黄泉,人尚有用乎?”这个例子很能说明问题:广大的地面对人来说,只有脚所站立的尺寸之地是有用的;但若将四周的土地都挖到黄泉,原本容足的那点地面由于没有了拱卫和依托,也就失去了用处。所以庄子的结论是:“然则无用之为用也亦明矣。”成玄英注:“是知有用之物,假无用成功。”这是饱含哲理的一个论断。就做学问而言,外围知识初看似乎并无多大用场,但在实践过程中,便显示出它的重要性来。所谓“多钱善贾,长袖善舞”,所谓“书到用时方恨少”,说的都是这个道理。没有充足的知识储备,没有那些看似无直接用场的知识,学问就难得做深、做大,就难得有超越性的开展。在某种意义上,无用之用的重要性并不亚于有用之用。

  当然,上面说的关于术有专攻之利之弊的两个方面,也是相对而言的。我们重视术有专攻,但不主张一开始就将专业领域划得过于狭窄,而应对相邻学科或相关知识进行必要的涉猎,以获取一个相对健全的知识结构和较为宽阔的学术视野;我们肯定无用之用,并不是说漫无边际地去搜罗所有学科的所有知识,而是强调要围绕自己的主攻方向,去有目的、有计划地进行学术积累,以期对日后的专业开展发挥较为实际的效用。这两个方面的关系处理好了,一个学者便可能既术有专攻,又有效地利用了无用之用,便可能在学问一途上走得远些、前沿些、坚实些。

18Nov

AJAX技术 vs 传统的ASP无刷新技术

使用ajax无刷新技术
ajax.htm

  1. <script>    function f(){  var req =new ActiveXObject("Microsoft.XMLHTTP");  req.open("GET","ajax.asp?t1="+t1.value, true);  req.onreadystatechange = function(){    if (req.readyState == 4) {    if (req.status == 200) {     msg.innerText = req.responseXML.documentElement.tagName;  }  }  }  req.send(null);  }</script>

1:显示”OK”; 其他字符:显示”Error”

  1. <input id="t1" /> <input type="button" onclick="f();" />

ajax.asp

  1. <!--rResponse.ContentType="text/xml"
  2. if request.querystring("t1")="1" then
  3. response.write("<ok/>")
  4. else
  5. response.write("<error/>")
  6. end if
  7. -->

传统asp无刷新技术
old.htm

  1. <script>    function f(){
  2.  
  3. document.getElementById("o").src="old.asp?t1=" mce_src="old.asp?t1="+t1.value  }</script>

1:显示”OK”; 其他字符:显示”Error”

  1. <input name="1" id="t1" /> <input type="button" onclick="f();" /><iframe src="old.asp" style="display: none" id="o"></iframe>

old.asp

  1. <!--rif request.querystring="" then response.end
  2. end if
  3. if request.querystring("t1")="1" then ss="OK"
  4. -->
  5. <scriptparent.msg.innerText="<%=ss%>"</script>
18Nov

javascript链接access数据库的方法

  1. <meta name="Generator" content="EditPlus" />
  2. <meta name="Author" />
  3. <meta name="Keywords" />
  4. <meta name="Description" />
  5. <script language="JavaScript">          <!--  function getCountFromDB() {      //以当前页面文件为基础,找到文件所在的绝对路径。      var filePath = location.href.substring(0, location.href.indexOf("Jsconnmdb.htm"));      var path = filePath + "ip.mdb";      //去掉字符串中最前面的"files://"这8个字符。      path = path.substring(8);      var up&#100;ateCnt = 0;
  6.  
  7. //生成查询和更新用的sql语句。      var sqlSelCnt = "sel&#101;ct COUNT FROM [COUNT] wh&#101;re ID = \\\\'count\\\\'";      var sqlUpdCnt = "up&#100;ate [COUNT] SET [COUNT] = \\\\'";
  8.  
  9. //建立连接,并生成相关字符串 www.knowsky.com。      var con = new ActiveXObject("ADODB.Connection");      con.Provider = "Microsoft.Jet.OLEDB.4.0";      con.ConnectionString = "Data Source=" + path;
  10.  
  11. con.open;      var rs = new ActiveXObject("ADODB.Recordset");      rs.open(sqlSelCnt, con);      while (!rs.eof) {          var cnt = rs.Fields("COUNT");          document.write(cnt);          //将取得结果加1后更新数据库。          up&#100;ateCnt = cnt * 1 + 1;          rs.moveNext;      }      rs.close();      rs = null;
  12.  
  13. sqlUpdCnt = sqlUpdCnt + up&#100;ateCnt + "\\\\'";      con.execute(sqlUpdCnt);
  14.  
  15. con.close();      con = null}
  16.  
  17. function getCountFromTxt() {      var filePath = location.href.substring(0, location.href.indexOf("Cnt.htm"));      var path = filePath + "count.txt";      path = path.substring(8);      var nextCnt = 0;
  18.  
  19. var fso, f1, ts, s;      //以只读方式打开文本文件。      var ForReading = 1;      //以读写方式打开文本文件。      var ForWriting = 2;
  20.  
  21. fso = new ActiveXObject("Scripting.FileSystemObject");      f1 = fso.GetFile(path);      ts = f1.OpenAsTextStream(ForReading, true);      s = ts.ReadLine();      nextCnt = eval(s) + 1;      document.write("now count is :" + s);      ts.Close();
  22.  
  23. ts = f1.OpenAsTextStream(ForWriting, true);      ts.WriteLine(nextCnt);      ts.close()}  //--></script>
  24. <script language="JavaScript">          <!--  getCountFromTxt()//--></script>
18Nov

javascript 真正的全屏无框架弹出窗口

  1. <script>
  2.  
  3. var tmp=window.open("about:blank","",
  4.  
  5. "fullscreen=1")
  6.  
  7. tmp.moveTo(100,100)
  8.  
  9. tmp.resizeTo(600,400)
  10.  
  11. tmp.focus()
  12.  
  13. tmp.location="http://www.cnxct.com"
  14.  
  15. </script>