2005年05月20日

一直用winxpsp2下d7编写东东,从没出现什么编译错误,再一次装了xpsp2系统,发现出现access violation at address 05f3304e in module ‘BORdbk70.dll’, Read of address 00000010."
错误,经比较发现应该是sp2_2096版本会有这个错误!下面是解决方法:下载下面的文件将其中的psapi.dll解压到程序目录bin文件夹下即可解决http://www.dll-files.com/dllindex/pop.php?psapi

2005年04月29日

悲天悯人万世怜!

绿意盎然花作妾,

一将功成万骨枯!

破碎虚空烟花散。

呵呵 月虚迷 长河落 回梦神游。。。

                                                                                   ——《寻龙记》有感

2005年01月21日

神州数码/华硕:
用户名:adsl             密码:adsl1234
全向:
用户名:root             密码:root
普天:
用户名:putian           密码:123456 
e-tek
用户名:admin            密码:12345
zyxel
用户名:anonymous   密码:1234
北电
用户名:anonymous   密码:12345
大恒
用户名:admin        密码:admin
大唐
用户名:admin         密码:1234
斯威特
用户名:root            密码:root
用户名:user           密码:user
中兴
用户名:adsl           密码:adsl831
(中兴的adsl的密码前面为adsl,后面为型号,比如中兴831,密码就是adsl831)

2004年11月23日

用Delphi在2000和XP/2003下从Ring3进入Ring0的无驱动解决方法


 


需要JEDI Win32 APIJWA)库支持


 


uses


  Windows, Dialogs, SysUtils, NTDDK,


  JwaWinNT, JwaWinType, JwaNtStatus, JwaAccCtrl, JwaAclApi, ntdll;


 


const


  KGDT_NULL     = 0;


  KGDT_R0_CODE  = 8;


  KGDT_R0_DATA  = 16;


  KGDT_R3_CODE  = 24;


  KGDT_R3_DATA  = 32;


  KGDT_TSS      = 40;


  KGDT_R0_PCR   = 48;


  KGDT_R3_TEB   = 56;


  KGDT_VDM_TILE = 64;


  KGDT_LDT      = 72;


  KGDT_DF_TSS   = 80;


  KGDT_NMI_TSS  = 88;


 


type


  TGDT = record


    Limit,


    BaseLow,


    BaseHigh : Word;


  end;


 


  PHYSICAL_ADDRESS = Large_Integer;


  CALLGATE_DESCRIPTOR = record


    Offset_0_15, Selector: Word;


    GateDescriptor:Word;


    Offset_16_31: Word;


  end;


 


implementation


 


function ZwOpenSection; external ‘ntdll.dll’;


function ZwClose; external ‘ntdll.dll’;


 


function SetDebugPrivilege(CanDebug: boolean): Boolean;


 


  function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;


  var


    TP: Windows.TOKEN_PRIVILEGES;


    Dummy: Cardinal;


  begin


    TP.PrivilegeCount := 1;


    LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);


    if bEnable then


      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED


    else TP.Privileges[0].Attributes := 0;


    AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);


    Result := GetLastError = ERROR_SUCCESS;


  end;


var


  hToken: Cardinal;


begin


  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);


  Result := EnablePrivilege(hToken, SE_DEBUG_NAME, CanDebug);


  CloseHandle(hToken);


end;


 


function SetPhyscialMemorySectionCanBeWrited(hSection: THandle): boolean;


label CleanUp;


var


  pDacl, pNewDacl: JwaWinNT.PACL;


  pSD: JwaWinNT.PSECURITY_DESCRIPTOR;


  dwRes: DWORD;


  ea: EXPLICIT_ACCESS;


begin


  Result := false;


  pDacl := nil; pNewDacl := nil; pSD := nil;


  dwRes := GetSecurityInfo(hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION,


    nil, nil, @pDacl, nil, pSD);


  if dwRes <> ERROR_SUCCESS then


    begin


      MessageDlg(Format(‘GetSecurityInfo Error %d’, [dwRes]), mtError, [mbOK], 0);


      goto CleanUp;


    end;


  ZeroMemory(@ea, sizeof(EXPLICIT_ACCESS));


  ea.grfAccessPermissions := SECTION_MAP_WRITE;


  ea.grfAccessMode := GRANT_ACCESS;


  ea.grfInheritance := NO_INHERITANCE;


  ea.Trustee.TrusteeForm := TRUSTEE_IS_NAME;


  ea.Trustee.TrusteeType := TRUSTEE_IS_USER;


  ea.Trustee.ptstrName := ‘CURRENT_USER’;


  dwRes := SetEntriesInAcl(1, @ea, pDacl, pNewDacl);


  if dwRes <> ERROR_SUCCESS then


     begin


       MessageDlg(Format(‘SetEntriesInAcl Error : %d’, [dwRes]), mtError, [mbOK], 0);


       goto CleanUp;


     end;


  dwRes := SetSecurityInfo(hSection, SE_KERNEL_OBJECT,


    DACL_SECURITY_INFORMATION, nil, nil, pNewDacl, nil);


  if dwRes <> ERROR_SUCCESS then


     begin


       MessageDlg(Format(‘SetSecurityInfo Error : %d’, [dwRes]), mtError, [mbOK], 0);


       goto CleanUp;


     end;


  Result := true;


  CleanUp:


  if pSD<>nil then LocalFree(Cardinal(pSD));


  if pNewDacl<>nil then LocalFree(Cardinal(pNewDacl));


end;


 


function OpenPhysicalMemory: THandle;


var


  hSection : THandle;


  status: NTSTATUS;


  objName: UNICODE_STRING;


  objectAttributes: OBJECT_ATTRIBUTES;


begin


  Result := 0;


  RtlInitUnicodeString(@objName, ‘\Device\PhysicalMemory’);


  InitializeObjectAttributes(@objectAttributes, @objName,


    OBJ_CASE_INSENSITIVE or OBJ_KERNEL_HANDLE, 0, nil);


  status := ZwOpenSection(hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, @objectAttributes);


  if (status = STATUS_ACCESS_DENIED) then


     begin


       status := ZwOpenSection(hSection, READ_CONTROL or WRITE_DAC, @objectAttributes);


       if status = STATUS_SUCCESS then  SetPhyscialMemorySectionCanBeWrited(hSection);


       ZwClose(hSection);


       status := ZwOpenSection(hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, @objectAttributes);


     end;


  if status = STATUS_SUCCESS then Result :=hSection;


end;


 


procedure ClosePhysicalMemory(hPhysicalMemorySection: THandle);


begin


  ZwClose(hPhysicalMemorySection);


end;


 


function AddressIn4MBPage(Address: ULONG): Boolean;


begin


  Result := (Address > 0) and ($80000000<=Address) and (Address<$A0000000)


end;


 


function MiniMmGetPhysicalAddress(vAddress: ULONG): ULONG;


begin


  if AddressIn4MBPage(vAddress)


     then Result := vAddress – $80000000


     else Result := $FFFFFFFF;


end;


 


function MiniMmGetPhysicalPageAddress(VirtualAddress: ULONG): ULONG;


begin


  if AddressIn4MBPage(VirtualAddress)


     then Result := VirtualAddress and $1FFFF000


     else Result := $FFFFFFFF;


end;


 


function ExecRing0Proc(ProcEntryPoint: Pointer; SegmentLength: ULONG): boolean;


var


  GDT : TGDT; mapAddr: ULONG;


  hSection : THandle;


  cg: ^CALLGATE_DESCRIPTOR;


  farcall : array [0..2] of Word;


  BaseAddress: Pointer;


  setcg: boolean;


  i: Cardinal;


begin


  Result := false;


  asm SGDT GDT end;


  i := (gdt.BaseHigh shl 16) or gdt.BaseLow;


  mapAddr := MiniMmGetPhysicalPageAddress(i);


  if mapAddr=$FFFFFFFF then


     begin


       MessageDlg(Format(‘Can not convert GDT virtual address of [Base = %s  Limit = %s]‘,


         [IntToHex(i, 8), IntToHex(GDT.Limit, 4)]), mtError, [mbOK], 0);


       Exit;


     end;


  hSection := OpenPhysicalMemory;


  if hSection=0 then


     begin


       MessageDlg(‘Error in open physical memory.’, mtError, [mbOK], 0);


       Exit;


     end;


  BaseAddress := MapViewOfFile(hSection, FILE_MAP_READ or FILE_MAP_WRITE, 0, mapAddr,    //low part


                     (gdt.Limit+1));


  if BaseAddress = nil then


     begin


       ZwClose(hSection);


       MessageDlg(Format(‘MapViewOfFile Error : %s%sGDT : Address = %s   Limit = %s’,


         [SysErrorMessage(GetLastError), #13#10, IntToHex(mapAddr, 8), IntToHex(GDT.Limit, 4)]), mtError, [mbOK], 0);


       Exit;


     end;


  setcg := false;


  i := Cardinal(BaseAddress)+8;  // skip first empty entry


  while i < Cardinal(BaseAddress)+(gdt.Limit and $FFF8) do


    begin


      cg:=Ptr(i);


      with cg^ do


        begin


          if IntToHex(GateDescriptor, 4)[2] = ‘0′ then  // call gate not present


             begin   // install callgate


               Offset_0_15 := LOWORD(Integer(ProcEntryPoint));


               Selector := KGDT_R0_CODE; // ring 0 code


               // [Installed flag=1] [Ring 3 code can call=11] 0 [386 call gate=1100] 00000000


               GateDescriptor := $EC00;


               Offset_16_31 := HIWORD(Integer(ProcEntryPoint));


               setcg := TRUE;


               Break;


             end;


        end;


      Inc(i, 8);


    end;


  if not setcg then


     begin


       UnMapViewOfFile(BaseAddress);


       ZwClose(hSection);


       MessageDlg(‘Can not install CallGate in your system GDT’, mtError, [mbOK], 0);


       Exit;


     end;


  farcall[0] := 0;  farcall[1] := 0;


  farcall[2] := (short(ULONG(cg)-ULONG(BaseAddress))) or 3;  //Ring 3 callgate;


  if not VirtualLock(ProcEntryPoint, SegmentLength) then


     begin


       MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);


       Exit;


     end;


  try


    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);


    Sleep(0);


    asm  // call callgate


      //  push arg1 … argN  // call far fword ptr [farcall]


      LEA EAX, farcall  // load to EAX


      DB 0FFH, 018H  // hardware code, means call fword ptr [eax]


    end;


    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_NORMAL);


    Result := true;


  except


    on e: Exception do MessageDlg(e.Message, mtError, [mbOK], 0);


  end;


  VirtualUnlock(ProcEntryPoint, SegmentLength);


  // Clear callgate


  FillChar(cg^, 8, 0);


  UnMapViewOfFile(BaseAddress);


  ClosePhysicalMemory(hSection);


end;


 


使用示例,读取CMOS时钟:


unit NTRing0_Unit;


 


interface


 


uses


  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,


  Dialogs, StdCtrls, Buttons;


 


type


  TForm1 = class(TForm)


    BitBtn1: TBitBtn;


    procedure BitBtn1Click(Sender: TObject);


  private


    { Private declarations }


  public


    { Public declarations }


  end;


 


var


  Form1: TForm1;


  tHour, tMin, tSec: byte;


 


implementation


 


{$R *.dfm}


 


uses NTRing0;


 


procedure Ring0Proc; stdcall;


begin


  asm            // ring0 prolog


    PUSHAD // push eax,ecx,edx,ebx,ebp,esp,esi,edi onto the stack


    PUSHFD // decrement stack pointer by 4 and push EFLAGS onto the stack


    CLI    // disable interrupt


    // execute your ring0 code here …


    MOV AH,0


    MOV DX,$70


    MOV AL,AH


    OUT DX,AL


    INC DX


    IN AL,DX


    MOV tSec,AL


    //


    MOV AH,2


    MOV DX,$70


    MOV AL,AH


    OUT DX,AL


    INC DX


    IN AL,DX


    MOV tMin,AL


    //


    MOV AH,4


    MOV DX,$70


    MOV AL,AH


    OUT DX,AL


    INC DX


    IN AL,DX


    MOV tHour,AL


    // ring0 epilog


    POPFD // restore registers pushed by pushfd


    POPAD // restore registers pushed by pushad


    RETF  // you may retf <sizeof arguments> if you pass arguments


  end;


end;


 


procedure TForm1.BitBtn1Click(Sender: TObject);


begin


  //  execute ring 0


  if ExecRing0Proc(@Ring0Proc, 100) then


  ShowMessage(Format(‘CMOS Time is %d:%d:%d’,


    [10*(tHour shr 4) + tHour and $F,


     10*(tMin shr 4) + tMin and $F,


     10*(tSec shr 4) + tSec and $F]));


end;


 


end.

调用NTOSKrnl.exe中的Ring0函数实现VA->PA(虚拟地址到物理地址)的转换
type
  TMemoryAddress = record
    PhysicalAddress : PHYSICAL_ADDRESS;  //*000
    VirtualAddress : DWord;  //*008
  end;

var
  MemoryAddress : TMemoryAddress;
  _MmGetPhysicalAddress : Cardinal;


  NTOSBaseAddr : Cardinal;
// NTOSkern.exe的加载地址,2003系统默认是$804DE000


procedure Ring0Func; stdcall;
begin
  asm
    pushad
    pushf
    cli


    mov esi, MemoryAddress.VirtualAddress
    push esi
    call _MmGetPhysicalAddress
    mov MemoryAddress.PhysicalAddress.LowPart, eax  // save low part of LARGE_INTEGER
    mov MemoryAddress.PhysicalAddress.HighPart, edx       // save high part of LARGE_INTEGER


    popf
    popad
    retf
  end;
end;



procedure MmGetPhysicalAddress;
var hNTDll: THandle;
begin
  _MmGetPhysicalAddress := 0;
  hNTDll := LoadLibrary(‘ntoskrnl.exe’);
  if hNTDll <> 0 then
     begin
       _MmGetPhysicalAddress := NTOSBaseAddr + Cardinal(GetProcAddress(hNTDll, ‘MmGetPhysicalAddress’)) – hNTDll;
       FreeLibrary(hNTDll);
//       ShowMessage(Format(‘Virtual address of MmGetPhysicalAddress in Kernel Mode  : %s’, [IntToHex(_MmGetPhysicalAddress, 8)]));
     end;
  if _MmGetPhysicalAddress > 0 then ExecRing0Proc(@Ring0Func, 32);
end;

……
MemoryAddress.VirtualAddress := StrToInt64Def(Edit1.Text, $806AB000);
  MmGetPhysicalAddress;
  Memo1.Lines.Add(Format(‘(Ring 0 Mode) Virtual address : $%s  = Physical address : $%s’,
    [IntToHex(MemoryAddress.VirtualAddress, 8),
     IntToHex(MemoryAddress.PhysicalAddress.LowPart, 8)]));


http://lysoft.7u7.net



2004年11月22日

诺诺两个多月了,从朋友那里借来照相机,拍了若干张照片上传,没有写什么照片说明,因为女儿在我眼里已经无法用词形容了.

2004年11月14日

经过反复测试,发现ie设置为The intenet是可以直接上任何网站的.而通过opera则不用任何设置直接就可以,这不能不说是对微软的讽刺。顺便比较一下这两个浏览器的优缺点。


Opera启动较慢 对内存要求较多 (mpx200可用内存并不多),而且与掌上狂拼由冲突,表现
为网页上的文本框内无法正常输入,据我观察,应该是Opera公司的网页文本框类与Ie不一样。
但是,他的优点非常明显,在英文mpx200上直接支持中文,更为可贵的是,他自动将各类网址
进行排版,适用于智能手机或者pda观看,而ie占用内存较少,启动迅速是其优点,但是不支持
中文,而且看网页,非常不便(需要反复长时间按左右导航键才能观看)。综上所述,大家应
该选择各有侧重。


2004年11月14 浙江 俞汉君 yuhj@zjjy.com

2004年11月12日

SmartPhone手机Mpx200上网设置全功略



一、Mpx200设置WAP、WWW上网


下载下面链接,放在mpx上执行就可以完成上网设置   
http://www.tompda.com/bbs/download.aspid=0402/tompda_334103_gprs.rar



也可以用下面的方法手工设置


从最初菜单开始
start——more——settings——more——data connections
看见的以下选项



Internet connection:
work connection:
WAP connection:
secure WAP connection:
先不管他们的选项建立wap 和gprs 的设定



菜单(menu)——1编辑连接(edit connections)——3代理服务器连接(proxy connections)——


这时可以看到很多选择,都说国外电信的设置不要管他,删除也行


menu–add
description:gprs wap-china(随便填也行)
连接方(connects from):WAP network
连接到(connects to):secure wap network
代理服务器proxy(名称name:端口port):10.0.0.172:9201
类型(type):WAP
done


 


menu——1.edit connection——4.GPRs connection
menu–add
description : GPRS-china(或自己填):
connect to:internet
访问点(access point):cmnet
user name:(空白)
password:(空白)
primary DNS:0.0.0.0
secondary DNS:0.0.0.0
IP adress:(空白)
done


menu——1.edit connection——4.GPRs connection
menu–add
description : GPRS wap-china(或自己填):
connect to:wap net
访问点(access point):cmwap
user name:(空白)
password:(空白)
primary DNS:0.0.0.0
secondary DNS:0.0.0.0
IP adress:(空白)
done


回到前面的菜单改为以下选项


如果只希望上WAP那么用下面的设置


Internet connection:gprs-china           //上WWW网
work connection:automatic          
WAP connection:GPRS WAP-china            //上WAP网
secure WAP connection: GPRS WAP-china     //MMS彩信


 


二、如何上网


 1、首先需要申请Gprs或Wap开通。


 2、你所在地区必须能被Grps信号覆盖


 3、上Wap网需要在手机的浏览器中设置为Wap (option->connectons->取消第一个选择框-〉然后选择Wap


network)


 4、可以上了附上几个网址


    wap.yahoo.com
    wap.monternet.com
    wap.tompda.com



三、电脑通过MPX200利用WAP接入点代理无线上WWW网(本人申请20不限流量的任我行套餐)



驱动程序在:http://www.motorola.com/mdirect/pdf/Smartfon.zip


1:将activesync的usb连接禁止掉。免得影响usb的连接。


2:运行mpx中自带的moden link,然后插上usb线。


3:系统发现新的usb设备,安装上面的驱动程序。


4:完成后多了MPX200的moden。(mpx200的modem驱动显示为2002,你可打开smartfon.ini文件修改为自己需要的


名称) 


5:运行mpx中自带moden link,激活ACTIVE(菜单中,实际上就是让MODEM在WINDOWS中出现)


6:台式机中的modEM设置(控制面板),最关键的地方:在”额外的初始化命令”那里填上



    AT+cgdcont=1,”IP”,”cmnet”,”",0,0 或者  AT+cgdcont=1,”IP”,”cmwap”,”",0,0
 


7:建立拨号连接或者用8提供的方法
  电话号码设置为*99#  用户与密码都为空  。


8:也可以利用中国移动随E行客户端而不设置拨号连接,需要注意的是在网络的gprs设置中需要指定为cmWap


  然后用手动连接选择Grps选择mpx200驱动进行拨号
  中国移动随E行客户端下载
  http://down1.tech.sina.com.cn/download/pda/2004-04-19/1589.shtml


9:要上WWW网必须对Ie进行设置


  工具-〉internet选项-〉连接-〉选择你建立的拨号项目或者中国随E行-〉设置-〉设置代理服务器: 


ip地址:10.0.0.172   端口:80
 
  同样在工具-〉internet选项-〉连接-〉局域网设置-〉设置代理服务器:
        ip地址:10.0.0.172   端口:80


 
10、电脑上安装CCPROXY进行必要的设置那么大部分网络程序都可以使用了



ok,可以利用wap无限流量上WWW网,虽然只有小猫的速度,但是比小猫拨号好多了(小猫没有包月服务,很费钱


,而且不爽)


感谢TomPda上的几篇文章,上面所述大部分来自他们的功劳,我做了比较细致地描述并进行了非常有必要的补


充,以及加上了自己的一些看法。以下是这些文章的连接,相信结合本文与这些文章应该可以顺利搞定mpx200


的设置(当然不局限于mpx200,其他smpatphone应该都可以)


mpx200 gprs wap设置详解
http://www.tompda.com/bbs/display.asp?luntan=27&forumID=1750764



利用smartphone最为外置MODEM连接笔记本上网全功略
http://www.tompda.com/bbs/display.asp?luntan=27&forumID=1767699


CMWAP包月GPRS上网套餐的使用!
http://www.tompda.com/bbs/display.asp?luntan=1&forumID=1775939


 



2004年11月12日  浙江  俞汉君



  



  

2004年11月07日

尼姆达病毒非常猖獗 几乎难以彻底查杀 ,其最明显的特征是Word 写字板等编辑软件在存盘、页面设置时出现内存不足等问题 同时该现象表明你的系统存在远程缓冲区溢出漏洞,为此 利用今天中午写了个小工具 可以解决上述两个问题,大家不妨试用一下。

下载地址

http://free.efile.com.cn/user2ccc/WordFix.rar

浙江 诸暨 俞汉君  yuhj@zjjy.com

2004年10月28日

 

本想补完仙剑叙后两集 却出现

 

“出现禁止的字符 系统不予接受“

 

郁闷  还是将仙剑前两集也删把 真恼火!

2004年10月19日

在Net2003 SmartPhone开发环境布置中 与模拟器的连接时最头疼的问题 经过摸索 过程如下(中文环境):

 

1、 安装activesync新版

2、 安装vs.net2003

3、 安装Smartphone SDK 2003

4、 安装Chinese Simplified Emulation Image

不可以颠倒顺序,否则会弄得你焦头烂额。。。。。。