当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 現在我的table中有編號姓名等字段﹐和一個簽名檔(該字段類型為image)﹐現在我想顯示其它資料的同時也顯示該簽名檔﹐目前我都可以做到﹐但檔簽名檔為空時﹐顯示的圖片就連不上了﹐于是我想當簽名檔為空時就顯示目前無簽名檔﹐但我不知道有什么辦法可以判斷image字段為空﹐請各位賜教﹐謝謝 ......
    摘要: execution plan ---------------------------------------------------------- 0 select statement optimizer=choose 1 0 table access (full) of test1 statistics ----------------------------------------......


如何得到另一个进程中的线程正在使用的tcp/ip端口

如何得到另一个进程中的线程正在使用的tcp/ip端口?

NO.1   作者: xuying

这个基本上很难,需要用到windows核心编程。除非那个程序向你提供信息。  
  有个程序可以参考:fport.exe  
   
  http://www.foundstone.com/knowledge/proddesc/fport.html  
  http://rr.sans.org/sysadmin/fport.php

NO.2   作者: spark_li

再谈进程与端口的映射    
  来源:www.whitecell.org    
  Author     :   ilsy    
  Email       :   ilsy@whitecell.org    
  HomePage:   http://www.whitecell.org    
          关于进程与端口映射的文章已经有很多了,我把我对fport的分析也写出来,让大家知道fport是如何工作的.    
  fport.exe是由foundstone   team出品的免费软件,可以列出系统中所有开放的端口都是由那些进程打开的.而下    
  面所描述的方法是基于fport   v1.33的,如果和你机器上的fport有出入,请检查fport版本.    
   
          首先,它检测当前用户是否拥有管理员权限(通过读取当前进程的令牌可知当前用户是否具有管理权限,请参考    
  相关历程),如果没有,打印一句提示后退出,然后设置当前进程的令牌,接着,用ZwOpenSection函数打开内核对象    
  \Device\PhysicalMemory,这个对象用于对系统物理内存的访问.ZwOpenSection函数的原型如下:    
   
  NTSYSAPI    
  NTSTSTUS    
  NTAPI    
  ZwOpenSection(    
          Out   PHANDLE   sectionHandle;    
          IN   ACCESS_MASK   DesiredAccess;    
          IN   POBJECT_ATTRIBUTES   ObjectAttributes    
          };    
  (见ntddk.h)    
   
  第一个参数得到函数执行成功后的句柄    
  第二个参数DesiredAccess为一个常数,可以是下列值:    
          #define   SECTION_QUERY               0x0001    
          #define   SECTION_MAP_WRITE       0x0002    
          #define   SECTION_MAP_READ         0x0004    
          #define   SECTION_MAP_EXECUTE   0x0008    
          #define   SECTION_EXTEND_SIZE   0x0010    
   
          #define   SECTION_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\    
                                                          SECTION_MAP_WRITE   |             \    
                                                          SECTION_MAP_READ   |               \    
                                                          SECTION_MAP_EXECUTE   |         \    
                                                          SECTION_EXTEND_SIZE)    
          (见ntddk.h)    
  第三个参数是一个结构,包含要打开的对象类型等信息,结构定义如下:    
          typedef   struct   _OBJECT_ATTRIBUTES   {    
                  ULONG   Length;    
                  HANDLE   RootDirectory;    
                  PUNICODE_STRING   ObjectName;    
                  ULONG   Attributes;    
                  PVOID   SecurityDescriptor;                 //   Points   to   type   SECURITY_DESCRIPTOR    
                  PVOID   SecurityQualityOfService;     //   Points   to   type   SECURITY_QUALITY_OF_SERVICE    
          }   OBJECT_ATTRIBUTES;    
          typedef   OBJECT_ATTRIBUTES   *POBJECT_ATTRIBUTES;    
          (见ntdef.h)    
  对于这个结构的初始化用一个宏完成:    
          #define   InitializeObjectAttributes(   p,   n,   a,   r,   s   )   {   \    
                  (p)->Length   =   sizeof(   OBJECT_ATTRIBUTES   );                     \    
                  (p)->RootDirectory   =   r;                                                           \    
                  (p)->Attributes   =   a;                                                                 \    
                  (p)->ObjectName   =   n;                                                                 \    
                  (p)->SecurityDescriptor   =   s;                                                 \    
                  (p)->SecurityQualityOfService   =   NULL;                               \    
                  }    
          (见ntdef.h)    
  那么,打开内核对象\Device\PhysicalMemory的语句如下:    
  WCHAR         PhysmemName[]   =                 L"\\Device\\PhysicalMemory";    
  void   *     pMapPhysicalMemory;    
  HANDLE     pHandle;    
   
  bool         OpenPhysicalMemory()    
  {    
          NTSTATUS         status;    
          UNICODE_STRING         physmemString;    
          OBJECT_ATTRIBUTES   attributes;    
          RtlInitUnicodeString(   &physmemString,   PhysmemName   );   //初始化Unicode字符串,函数原型见ntddk.h            
          InitializeObjectAttributes(   &attributes,   &physmemString,    
                                            OBJ_CASE_INSENSITIVE,   NULL,   NULL   );   //初始化OBJECT_ATTRIBUTES结构    
          status   =   ZwOpenSection(pHandle,   SECTION_MAP_READ,   &attributes   );   //打开内核对象\Device\PhysicalMemory,获得句柄    
          if(   !NT_SUCCESS(   status   ))    
                  return   false;    
          pMapPhysicalMemory=MapViewOfFile(pHandle,FILE_MAP_READ,    
                                                        0,0x30000,0x1000);    
          //从内存地址0x30000开始映射0x1000个字节    
          if(   GetLastError()!=0)    
                  return   false;                                              
          return   true;    
  }    
   
          为什么要从0x30000开始映射呢,是这样,我们知道,在Windows   NT/2000下,系统分为内核模式和用户模式,也就是我们    
  所说的Ring0和Ring3,在Windows   NT/2000下,我们所能够看到的进程都运行在Ring3下,一般情况下,系统进程(也就是System    
  进程)的页目录(PDE)所在物理地址地址为0x30000,或者说,系统中最小的页目录所在的物理地址为0x30000.而页目录(PDE)由    
  1024项组成,每项均指向一页表(PTE),每一页表也由1024个页组成,而每页的大小为4K,1024*4=4096(0x1000),所以,上面从物    
  理地址0x30000开始映射了0x1000个字节.(具体描述见WebCrazy的文章<<小议Windows   NT/2000的分页机制>>)    
 

NO.3   作者: gdxflm

还有一种办法,写TDI驱动,可以直接加在tcpip协议驱动之上。所有的对tcpip的请求都可以被此TDI驱动首先截获,从而得到一张系统的端口/进程的对应关系表。  
   
  我做的这个软件,http://www.csdn.net/cnshare/soft/11/11391.shtm  
  其实已经实现了这个功能,不过我给出的是进程号,线程号要给出来是没问题的。


 ·我又一次糊涂了    »显示摘要«
    摘要: no1.这是一句我认为错误,但可以直接运行的: system.windows.forms.messagebox.show ("dddddddddddddd"); no2.这是2句我认为正确,但根本不可能运行的: system.windows.forms.messagebox xx=new system.windows.forms.messagebox() ; xx.sh......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE