posts - 23,  comments - 20,  trackbacks - 0
 
最近又闲着了...
技术人员一闲着就蛋疼...得找点东西学 , 何况我还是一只小菜鸟   今天下了本电子书  看看C#的WinForm 一点一点来

根据书上的知道  新建了第一个工程  发现了一个C#的关键字Region很有意思  折叠代码用的 而且还能有注释   相当好用  特别是工程大了一点点以后  这个就使得代码更加好看了 新语言就是好... 无奈 C++没有这个关键字   不管有没有  上网搜索一下吧   居然发现MSDN里面有
MSDN 这个关键字   吼吼  看了一下 
//语法描述
#pragma region name
#pragma endregion comment
//END

//实例代码
#pragma region Region_1
void Test() {}
void Test2() {}
void Test3() {}
#pragma endregion Region_1

int main() {}
我拿到工程里面去试了一下  居然没有  MSDN骗人??才不会呢  旁边有一个提醒框
This page is specific to
Microsoft Visual Studio 2005/.NET Framework 2. 0
呵呵  我用的是VS2003   不过还好机器还装了2008  测试一下  真的可以  哈哈  不错不错 

posted @ 2009-09-03 12:22 李佳 阅读(16065) | 评论 (14)编辑 收藏
头大 越学习  越多新的术语 ...

列个表单  N年后自己再回来看看吧

XML WinForm .Net 正则表达式 内核编程 ASM 高级应用程序调试   高级内核编程(HOOK 与 反HOOK)
还有么???想到了就增加吧...

新增   WPF  WDF TDD

累么??   不累!!

posted @ 2009-09-02 20:51 李佳 阅读(264) | 评论 (0)编辑 收藏
最近在做一个网站的模拟登录程序  前段时间一直忙于做验证码  算是做好了
今天才正式登陆   发送了无数次的登录信息   一直增  改  就是登陆不了  总是提示错误
但是利用IE截获的HTTP封包来看   几乎都是一摸一样的...
这个是截获的IE封包

POST /app HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-silverlight, application/msword, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: ***
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; TencentTraveler 4.0;  Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; CIBA)
Host: ***
Content-Length: 264
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CHANNEL_JSESSIONID=Kc8GLn0Gvvn4Vl7sLjh5kN1nT5DZQknp1nXDRxch9GnTr5TYKncf!2134775339!730718407

service=direct%2F1%2FHome%2F%24Form&sp=S0&Form0=%24FormConditional%2Cblogin%2C%24FormConditional%240&%24FormConditional=T&%24FormConditional%240=F&select=%B8%F6%C8%CB%BF%CD%BB%A7&SERIAL_NUMBER=111222333&USER_PASSWD=123123&EFFICACY_CODE=2598&blogin=+%B5%C7%C2%BC+

以下是我发送出去的封包
POST /app HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Referer: ***
Accept: */*
User-Agent: GetBalance
Host: ***
Content-Length: 300
Cache-Control: no-cache
Cookie: CHANNEL_JSESSIONID=Kc3V7JTn32G0G6yj8KnyhYpRHvHp1gf9pX033l5WjZV6gRh75ZRn!-1722555788!2134775339

service=direct%2F1%2Ffeequery.FeeQuery%2F%24HHeader.%24GHHeader.%24Form&sp=S0&Form0=%24FormConditional%2Cblogin%2C%24FormConditional%240&%24FormConditional=T&%24FormConditional%240=F&select=%B8%F6%C8%CB%BF%CD%BB%A7&SERIAL_NUMBER=111222333&USER_PASSWD=123123&EFFICACY_CODE=1204&blogin=+%B5%C7%C2%BC+

几乎都无误  以前登陆的无数的网站  都还没有这么多头   这次一个一个的增加  加了这么多的头  居然还是不行
烦的狠  就用火狐打开看看  显示 "Components Head not exist"    我的IE可没有显示这个信息
联想到以前在邪八里面看到的文章  里面似乎提过User-Agent检测    是不是这个网站也增加了这个检测呢???
于是 在Post数据中在增加一行
pFile -> AddRequestHeaders("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; TencentTraveler 4.0;  Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; CIBA)");
提交  居然显示成功了...
汗...
保留下来  以备不时之需

posted @ 2009-09-01 10:19 李佳 阅读(1487) | 评论 (0)编辑 收藏
 1 
 2    CString Fullstring, Appname, Fileext;
 3    Fullstring.LoadString(IDR_MAINFRAME);
 4     //获取完整的分割串
 5    AfxExtractSubString(Appname, Fullstring, 0'\n');    
 6     //析出第一个子串
 7    AfxExtractSubString(Fileext, Fullstring, 4'\n');    
 8     //析出第四个子串

CString 和COleDateTime之间的转换
CString   str   
=   "2004-07-08   11:22:33";     
        COleVariant   VariantTime;   
        VariantTime   
=   str;   
        VariantTime.ChangeType(VT_DATE);   
        COleDateTime   DataTime   
=   VariantTime;  
STR)strHTML,strHTML.GetLength(),5 tmp,strHTML.GetLength()+1);
6     strHTML = tmp;
7     delete tmp;
8 

_RecordsetPtr bInDateBase = m_pConn->Execute((_variant_t)strSQL , &index , 1);
if (!bInDateBase->adoEOF)    //有数据
{
}

1 _variant_t var;
2 var= m_pRecordset->GetCollect("posInfo");        //可能为空
3 if(var.vt != VT_NULL)    //为NULL
4     strPosInfo = var;
5 else 
6     strPosInfo = “”;
7 
 1 //将字符串数字传换成BCD码 -- 例如  "1234"  ->  0x1234
 2 void CGPS_Info_Redirect_CZDlg::CStringDataToBCDData(CString strData , BYTE* bBCD)
 3 {         
 4     for (int i = 0 ; i < strData.GetLength() ; i++)
 5     {
 6         ASSERT(strData[i] >= '0' && strData[i] <='9');
 7         if (i % 2 == 0)    //1,3,5,7,9
 8         {
 9             bBCD[i/2=(strData[i] - 0x30)<<4;//左移四位            
10         }
11         else
12         {
13             bBCD[i/2+= (strData[i] - 0x30);
14         }
15     }
16 }
 1 //将int类型copy到BYTE数组中
 2 void CGPS_Info_Redirect_CZDlg::CopyIntToByte(BYTE* data , int iData)
 3 {
 4     WORD wHigh = HIWORD(iData);
 5     WORD wLow = LOWORD(iData);
 6     data[0= HIBYTE(wHigh);
 7     data[1= LOBYTE(wHigh);
 8     data[2= HIBYTE(wLow);
 9     data[3= LOBYTE(wLow);
10 }
11 

posted @ 2009-08-28 17:08 李佳 阅读(235) | 评论 (0)编辑 收藏
     摘要: 驱动其实很早以前就写了  只不过功能没有达到  加上一直很忙 所以就放下了 今天闲着无聊  就接着写吧...写完了 发上来 留着 主要的问题就是效率很低下   不知道为什么有大量的IRP_MJ_DEVICE_CONTROL 这个IRP  CPU全部占满程序很简单  暴力枚举 主要是锻炼一下内核编程 以及WinDbg的调试头文件...  阅读全文
posted @ 2009-08-28 16:20 李佳 阅读(1451) | 评论 (0)编辑 收藏
由于昨天太晚 没有看完 今天继续看  继续转
原帖地址
http://blog.csdn.net/vagrxie/archive/2009/07/31/4398721.aspx
今天要转的就是  SEH + MiniDump  实现既Dump文件  又让程序继续运行

 1 #include "stdafx.h"
 2 #include <windows.h>
 3 #include <Dbghelp.h>
 4 using namespace std;
 5 
 6 #pragma auto_inline (off)
 7 #pragma comment( lib, "DbgHelp" )
 8 
 9 // 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
10 
11 LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo    )
12 {
13     HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
14     MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
15     loExceptionInfo.ExceptionPointers = ExceptionInfo;
16     loExceptionInfo.ThreadId = GetCurrentThreadId();
17     loExceptionInfo.ClientPointers = TRUE;
18     MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
19     CloseHandle(lhDumpFile);
20     return EXCEPTION_EXECUTE_HANDLER;
21 }
22 
23 void Fun2()
24 {
25     __try
26     {
27         static bool b = false;
28         if(!b)
29         {
30             b = true;
31             int *= NULL;
32             *= 0;
33         }
34         else
35         {
36             MessageBox(NULL, _T("Here"), _T(""), MB_OK);
37         }
38     }
39     __except(MyUnhandledExceptionFilter(GetExceptionInformation()))
40     {
41     }
42 }
43 
44 void Fun()
45 {
46     Fun2();
47 }
48 
49 int main()
50 {
51     Fun();
52     Fun();  //用于显示MessageBox
53     return 1;
54 }
55 
56 
最后转一句话
Make it right before you make it faster. Keep it right when you make it faster. Make it clear before you make it faster. Do not sacrifice clarity for small gains in efficiency.
posted @ 2009-08-28 09:16 李佳 阅读(568) | 评论 (0)编辑 收藏
DUMP文件很实用  留下来
 1 LONG WINAPI MyUnhandledExceptionFilter(      _EXCEPTION_POINTERS *ExceptionInfo     );
 2 
 3 //在程序里面调用
 4 SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);
 5 //来设置
 6 LONG WINAPI MyUnhandledExceptionFilter( _EXCEPTION_POINTERS *ExceptionInfo )
 7 {
 8     HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
 9 
10     MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
11 
12     loExceptionInfo.ExceptionPointers = ExceptionInfo;
13 
14     loExceptionInfo.ThreadId = GetCurrentThreadId();
15 
16     loExceptionInfo.ClientPointers = TRUE;
17 
18     MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
19 
20     CloseHandle(lhDumpFile);
21 
22     return EXCEPTION_EXECUTE_HANDLER;
23 }


posted @ 2009-08-27 18:08 李佳 阅读(185) | 评论 (0)编辑 收藏
靠 什么事情都不先说清楚  需求也不说  就是让你做   做完了 再说需求   靠...
好烦   今天又得改程序...

没事好好看看软件架构方面的书吧   被经理能整死

学习中...痛苦中...

posted @ 2009-08-24 09:58 李佳 阅读(88) | 评论 (0)编辑 收藏
当数据库的选项允许为空时  而且此时内容为空
则一下查询会出错
strPosInfo= m_pRecordset->GetCollect("posInfo");       
更加奇怪的是  catch(...)也抓不到异常
今天碰着个问题算是头弄大了  最后终于弄好了
原因很简单

报错的问题

错误原因   在GetCollct返回了NULL之后   由于strPosInfo是一个CString对象  编译器自动将_varint_t转换成CString  而此时_varint_t为空  因此转换失败  不是数据库的异常 而且根本就不是异常 所以  catch(…)无法抓住

解决方案

在可能为空的地方 利用

 1 _variant_t var;
 2 
 3 var= m_pRecordset->GetCollect("posInfo");          //可能为空
 4 
 5 if(var.vt != VT_NULL)   //为NULL
 6 
 7        strPosInfo = var;
 8 
 9 else
10 
11        strPosInfo = “”;

就可以检测NULL值了




posted @ 2009-08-21 16:01 李佳 阅读(2366) | 评论 (1)编辑 收藏
服务器又出问题了   实在是没办法了  因为那得错误我这边没办法重现  也不知道如何写dump文件 而经理又不让安装VS  没办法  最后只能使用WinDbg 来调试了  网上找了相关资料
先Copy下来吧  以后还是会用的   还有  要买书了  在学校的时候看见了<软件调试>  只是觉得厚   没怎么看  现在后悔了...  要买了

先Copy资料吧


本篇文章得主要目的是介绍WINDBG的主要功能以及相关的命令。关于这些命令的详细语法,请参阅帮助文件。对文章中提到的许多命令,WINDBG有相应的菜单选项。
1.如何得到帮助

 在命令(Command)窗口中输入.hh 命会调出帮助文件令。

 .hh keyword

会显示关于keyword的详细命令。

2.启动Debugger

 Windbg可以用于如下三种调试:

 a.远程调试:你可以从机器A上调试在机器B上执行的程序。具体步骤如下:

? 在机器B上启动一个调试窗口(Debug Session)。你可以直接在Windbg下运行一个程序或者将Windbg附加(Attach)到一个进程。

? 在机器B的Windbg命令窗口上启动一个远程调试接口(remote):

.server npipe:pipe=PIPE_NAME

PIPE_NAME是该接口的名字。

? 在机器A上运行:

windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAME

SERVER_NAME是机器B的名字。

b.Dump文件调试:如果在你的客户的机器上出现问题,你可能不能使用远程调试来解决问题。你可以要求你的用户将Windbg附加到出现问题的进程上,然后在命令窗口中输入:

.dump /ma File Name

创建一个Dump文件。在得到Dump文件后,使用如下的命令来打开它:

windbg –z DUMP_FILE_NAME

c.本地进程调试:你可以在Windbg下直接运行一个程序:

Windbg “path to executable” arguments

也可以将Windbg附加到一个正在运行的程序:

Windbg –p “process id”

Windbg –pn “process name”

注意有一种非侵入(Noninvasive)模式可以用来检查一个进程的状态并不进程的执行。当然在这种模式下无法控制被调试程序的执行。这种模式也可以用于查看一个已经在Debugger控制下运行的进程。具体命令如下:

Windbg –pv –p “process id”

Windbg –pv –pn “process name”


------------------------------------------------------------

调试多个进程和线程

 如果你想控制一个进程以及它的子进程的执行,在Windbg的命令行上加上-o选项。Windbg中还有一个新的命令.childdbg 可以用来控制子进程的调试。如果你同时调试几个进程,可以使用 | 命令来显示并切换到不同的进程。

在同一个进程中可能有多个线程。~命令可以用来显示和切换线程。

 ------------------------------------------------------------

调试前的必备工作

在开始调试前首先要做的工作是设置好符号(Symbols)路径。没有符号,你看到的调用堆栈基本上毫无意义。Microsoft的操作系统符号文 件(PDB)是对外公开的。另外请注意在编译你自己的程序选择生成PDB文件的选项。如果设置好符号路径后,调用堆栈看起来还是不对。可以使用lm, !sym noisy, !reload 等命令来验证符号路径是否正确。

Windbg也支持源码级的调试。在开始源码调试前,你需要用.srcpath设置源代码路径。如果你是在生成所执行代码的机器上进行调试,符号文 件中的源码路径会指向正确的位置,所以不需要设置源代码路径。如果所执行代码是在另一台机器上生成的,你可以将所用的源码拷贝(保持原有的目录结构)的一 个可以访问的文件夹(可以是网络路径)并将源代码路径设为该文件夹的路径。注意如果是远程调试,你需要使用.lsrcpath来设置源码路径。

 ------------------------------------------------------------

静态命令:

1.显示调用堆栈:在连接到一个调试窗口后,首先要知道的就是程序当前的执行情况k* 命令显示当前线程的堆栈。~*kb会显示所有线程的调用堆栈。如果堆栈太长,Windbg只会显示堆栈的一部分。.kframes可以用来设置缺省显示框架数。

2.显示局部变量:接下来要做通常是用dv显示局部变量的信息。CTRL+ALT+V可以切换到更详细的显示模式。关于dv要注意的是在优化过的代 码中dv的输出极有可能是不准确的。这时后你能做的就是阅读汇编代码来发现你感兴趣的值是否存储在寄存器中或堆栈上。有时后当前的框架(Frame)上可 能找不到你想知道的数据。如果该数据是作为参数传到当前的方法中的,可以读一读上一个或几个框架的汇编代码,有可能该数据还在堆栈的某个地址上。静态变量 是储存在固定地址中的,所以找出静态变量的值较为容易。.Frame(或者在调用堆栈窗口中双击)可以用来切换当前的框架。注意dv命令显示的是当前框架 的内容。你也可在watch窗口中观察局部变量的值。

3.显示类和链表: dt可以显示数据结构。比如dt PEB 会显示操作系统进程结构。在后面跟上一个进程结构的地址会显示该结构的详细信息:dt PEB 7ffdf000。

Dl命令可以显示一些特定的链表结构。

4.显示当前线程的错误值:!gle会显示当前线程的上一个错误值和状态值。!error命令可以解码HRESULT。

5.搜索或修改内存:使用s 命令来搜索字节,字或双字,QWORD或字符串。使用e命令来修改内存。

6.计算表达式:?命令可以用来进行计算。关于表达式的格式请参照帮助文档。使用n命令来切换输入数字的进制。

7.显示当前线程,进程和模块信息:!teb显示当前线程的环境信息。最常见的用途是查看当前线程堆栈的起始地址,然后在堆栈中搜索值。!peb显示当前进程的环境信息,比如执行文件的路径等等。lm显示进程中加载的模块信息。

8.显示寄存器的值:r命令可以显示和修改寄存器的值。如果要在表达式中使用寄存器的值,在寄存器名前加@符号(比如@eax)。

9.显示最相近的符号:ln Address。如果你有一个C++对象的指针,可以用来ln来查看该对象类型。

10.查找符号:x命令可以用来查找全局变量的地址或过程的地址。x命令支持匹配符号。x kernel32!*显示Kernel32.dll中的所有可见变量,数据结构和过程。

 

11.查看lock:!locks显示各线程的锁资源使用情况。对调试死锁很有用。

12.查看handle:!handle显示句柄信息。如果一段代码导致句柄泄漏,你只需要在代码执行前后使用!handle命令并比较两次输出的区别。有一个命令!htrace对调试与句柄有关的Bug非常有用。在开始调试前输入:

!htrace –enable

然后在调试过程中使用!htrace handle_value 来显示所有与该句柄有关的调用堆栈。

13.显示汇编代码:u。

------------------------------------------------------------

程序执行控制命令:

1.设置代码断点:bp/bu/bm 可以用来设置代码断点。你可以指定断点被跳过的次数。假设一段代码KERNEL32!SetLastError在运行很多次后会出错,你可以设置如下断点:

bp KERNEL32!SetLastError 0x100.

在出错后使用bl 来显示断点信息(注意粗体显示的值):

0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError

重新启动调试(.restart命令)并设置如下的断点:

bp Kernel32!SetLastError 0x100-0x4f

Debugger会停在出错前最后一次调用该过程的地方。

你可以指定断点被激活时Debugger应当执行的命令串。在该命令串中使用J命令可以用来设置条件断点:

bp `mysource.cpp:143` "j (poi(MyVar)”0n20) ''; 'g' "

上面的断点只在MyVar的值大于32时被激活(g命令

条件断点的用途极为广泛。你可以指定一个断点只在特殊的情况下被激活,比如传入的参数满足一定的条件,调用者是某个特殊的过程,某个全局变量被设为特殊的值等等。

2.设置内存断点:ba可以用来设置内存断点。调试过程中一个常见的问题是跟踪某些数据的变化。如下的断点:

ba w4 0x40000000 "kb; g"

可以打印出所有修改0x40000000的调用堆栈。

3.控制程序执行:p, pa,t, ta等命令可以用来控制程序的执行。

4.控制异常和事件处理:Debugger的缺省设置是跳过首次异常(first chance expcetion),在二次异常(second chance exception)时中断程序的执行。sx命令显示Debugger的设置。sxe和sxd可以改变Debugger的设置。

sxe clr

可以控制Debugger在托管异常发生时中断程序的执行。常用的Debugger事件有:

av 访问异常

eh C++异常

clr 托管异常

ld 模块加载

-c 选项可以用来指定在事件发生时执行的调试命令。

powerwolf 发表于:2006.07.03 15:02
reference url:  http://powerwolf.itpub.net/post/20237/130218


特别要注意的就是!gle   这个命令相当于执行GetLastError()  而且还能查看内核的NTSTATUS

问题刚刚解决了    最后出现的问题也找到了   但是错误原因大跌眼镜   ------杀毒软件...

结论:
虽然我们需要丰富的调试技巧  但是  经验仍然是最重要的
就像找工作一样  学校里面你再牛   没有经验  你都比不过工作两年的高中生

posted @ 2009-08-20 11:51 李佳 阅读(457) | 评论 (0)编辑 收藏
仅列出标题
共3页: 1 2 3 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔分类

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜