| shuai 的个人资料娱乐精神照片日志 | 帮助 |
|
2007/10/26 强暴.net程序集 之五 (#~流的元数据表)警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责
#~流是保存元数据的地方, 元数据以表的形式进行组织 在Partition II Metadata描述为: 最值得注意是 Rows数组的大小为有效表的个数,每一个Rows元素记录了该表的记录的行数 通过计算记录行数和每行大小可以得到每个表的地址 tableID = 0; //下一个表的位置 上面程序有一个TableRowSizes函数用于计算某个表的行大小, 它将放在下一篇文章去描述 当然如果要使用元数据接口就更加方便, 可以调用 IMetaDataTables::GetTableInfo 以及 IMetaDataTables::GetNumTables 在ildasm中的dasm.cpp文件DumpStatistics 和 DumpTable 函数有一个实际调用的示例
2007/9/28 那些声音和记忆好吧我承认我又怀旧了 有些场景是永远无法抹去 好在我还不讨厌这种感觉 那一年他们单飞
2007/8/27 理解需求的本质试想一个案例
2007/8/2 自定义窗体最大化时不盖住任务栏自定义窗体最大化时不盖住任务栏
还原有时有问题,不管了
protected override void WndProc(ref Message m) { switch (m.Msg)
{ case WM_GETMINMAXINFO: RECT area = new RECT();
SystemParametersInfo(SPI_GETWORKAREA, 0, ref area, 0); MINMAXINFO info = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
info.ptMaxSize = new POINT(area.right, area.bottom); info.ptMaxPosition = new POINT(0, 0); info.ptMaxTrackSize = new POINT(area.right, area.bottom); info.ptMinTrackSize = new POINT(100, 200); Marshal.StructureToPtr(info, m.LParam, true);
m.Result = new IntPtr(0); //must return 0; return; } base.WndProc(ref m); } 2007/7/12 清纯与性感当我还是小孩的时候 我对宏定义和匈牙利命名,甚至是模版有莫名的感觉 是觉得它们丑陋么 年幼的我一直离她们远远的 那真是青涩少年 2007年
我越发对C#的清纯容颜感到不满 她太纯洁了 虽然很美 但时间长了没有味道 一开始的初恋感觉没有了 而那些性感的女郎们
黑色网袜 偶尔说两句脏话 或是抽抽烟 亦或是露出臂下的淡淡腋毛 那真是性感和迷人 hr = CoCreateInstance(CLSID_CSexy,
NULL, CLSCTX_INPROC_SERVER, IID_ISexy, (void **) &pSexy); if (SUCCEEDED(hr)) { pSexy->Attract(&me); }
然而 Virgin v = new Virgin() me.Say(v, "but, I still love you."); 2007/7/8 我想化成夏雨我想化成夏雨
打湿你的白衣 溶入你肌体 溶入溶入 和你有同的温婉 化作一体 我想化成花尘
粘上你的白衣 溶入你肌体 溶入溶入 和你有同的芬香 和你是一体 在你心里写上铭记
以诗句作誓言 忘记生我的云朵 放弃我飘向的目的 一直和你在一起
有种痛苦叫思念有种痛苦叫思念
思念 思念 只分隔一秒就留恋 一秒就像千年 十指分开灵魂却相牵 在梦里缠绵 有种痛苦叫思念 思念 思念 令心绪破茧 思念像箭 燃烧了我的冷淡 思念像火焰 2007/2/13 同步!! 不同!!原子操作 InterlockedIncrement 和 InterlockedDecrement
相当于 Interlocked.Increment 和 Interlocked.Decrement InterlockedExchange 和 InterlockedCompareExchange
相当于 Interlocked.Exchange 和 Interlocked.CompareExchange 线程
WaitForSingleObject(hThread, INFINITE)
相当于 thread.Join(Timeout.Infinite) WaitForMultipleObject(n, hThreads, TRUE, INFINITE)
没有相对应的 (试试Manual/AutoResetEvent.WaitAll 和 Monitor.Wait) SuspendThread(hThread) 和 ResumeThread(hThread)
相当于 thread.Suspend 和 thread.Resume() 关键段 EnterCriticalSection(&cs)
有点像 Monitor.Enter(object) LeaveCriticalSection(&cs)
有点像 Monitor.Exit(object) TryEnterCriticalSection(&cs)
有点像 Monitor.TryEnter(object) 事件对象 HANDLE hEvent = CreateEvent(&sa, TRUE, fInitialState, szName)
相当于 ManualResetEvent event = new ManualResetEvent(initialState) HANDLE hEvent = CreateEvent(&sa, FALSE, fInitialState, szName)
相当于 AutoResetEvent event = new AutoResetEvent(initialState) SetEvent(hEvent) 和 ResetEvent(hEvent)
相当于 event.Set() 和 event.Reset() WaitForSingleObject(hEvent, INFINITE)
相当于 event.WaitOne() WaitForMuSingleObject(n, hEvents, TRUE, INFINITE)
相当于 Manual/AutoResetEvent.WaitAll(events) WaitForMultipleObject(n, hEvents, FALSE, INFINITE)
相当于 Manual/AutoResetEvent.WaitAny(events) 2007/1/16 让MessageQueue.BeginReceive()阻塞让MessageQueue.BeginReceive()阻塞
我发现MessageQueue.BeginReceive()跟本不会阻塞
虽然文档上是这样写: 启动一个没有超时设定的异步接收操作。直到队列中出现消息时,才完成此操作。 但是事实证明不起作用
并且希望做到事件式触发 以及接收消息完一个后接收消息下一个 于是我使用了ManualResetEvent:
代码:
public class Program { private static ManualResetEvent signal = new ManualResetEvent(false); public static void Main() { ReceiveMessage(); } public static void ReceiveMessage()
{ try { MessageQueue messageQueue = new MessageQueue(".\\Private$\\StaticPageQueue"); messageQueue.Formatter = new BinaryMessageFormatter(); messageQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceiveCompleted); while (true)
{ Console.WriteLine("Receiving...");
messageQueue.BeginReceive();
signal.Reset(); //允许线程阻止
signal.WaitOne(); //阻止当前线程。直到收到信号 } } catch (Exception e) { Console.WriteLine(e.Message); } } private static void ReceiveCompleted(Object sender, ReceiveCompletedEventArgs asyncResult)
{ try { MessageQueue messageQueue = (MessageQueue)sender; Message message = messageQueue.EndReceive(asyncResult.AsyncResult); StaticPageMessage spMessage = (StaticPageMessage)message.Body; Console.WriteLine(spMessage.StaticPageType); signal.Set(); //允许阻塞线程继续 } catch (Exception e) { Console.WriteLine(e.Message); } } } 2006/12/21 密室杀人杀人魔术夜色中上演
死神也未看到真凶一面 没有脚印,没有指纹 封禁的密室如何逃脱 手法高超无声无息 只留下炉火中烧焦的手卷 真相就在此刻迷失 画中的三口棺材意味深长
死人从地下复活的传说 有内幕重重的手足相残 每个人所言说的谎言 贝克街的夏洛克也只能茫然 面具下的恶灵将正义埋葬 邪恶之手再次指向深渊
暗暗小巷上演第二幕凶案
开阔空间上演密室杀人手法 戏剧般开场,又戏剧般结束 泰晤士河流淌着亡灵的鲜血 和着肖邦惆怅的夜曲 在月光下浸着伤痛哀唱 卡尔笔下的神探 划破夜空揭开光芒 真理以微笑溶化了迷雾 华丽的残酷从此止伤 西敏寺的慰藉钟声回响 在白色的雪上写下了安详 2006/12/20 放假请注意看
12月30日(星期六)、12月31日(星期日)仍正常上班
01月01日(星期一)、01月02日(星期二)、01月03日(星期三)放假
这意味着又要上倒霉的、疲惫的、绝望的,连续七天的班
我不禁想骂两句
不过突然又想起我还有三天年假没休呢
哇哈哈
2006/10/21 基地系列之一《基地》虽然我现在仍还会认为心理史学是一门统计学 只不过需要考虑相当多的变量: 政治、宗教、经济、科技的发展等等 我觉得,这门学科名字中的“心理” 或许指的是这些因素对于社会心理的影响吧 而社会心理则将影响历史的进程 作为这门学科的创始人
或许也是唯一真正能够应用的人 谢顿预言到了银河帝国即将分裂 从而进入长达三万年的黑暗的战乱时期 为了缩短这个时间 他指入了一个变量 这就是基地 基地使命就是传承人类的文明与科技 来重建银河
值得赞叹的是
谢顿预计到了基地在发展中需要遇到种种危机 而这些危机实际上会促进基地的发展 第一次
基地受到银河边缘的四个国家的武力威胁 哈定利用这些国家的相互制约化解了危机 并以先进的技术影响这些国家 第二次
哈定将技术以宗教面目控制这四个国家 化解了企图进攻基地的第二次危机 第三次
其他国家禁止基地的宗教进入该国 马洛以行商的身份同这些国家进行贸易 使用它们在经济上依赖于基地 从而化解了企图进攻基地的第三次危机 简单的说就是利用了:势力均衡、宗教崇拜、贸易依赖
所以这书活脱脱的就是一部分社会发展史 书中的政党矛盾、篡权野心等等又像是一部政治大戏 让人不得为阿西莫夫的宏大知识赞叹 不过书中描写的未来技术确实让人失望
毕竟作者写作本书时才刚刚产生电脑和原子弹嘛 2006/10/3 让CTRL+C无法中止控制台程序为了玩深CLR Host
我又从win32api重新开始...
win32api确实很赞
我没有看错它
原来我一直在写梨花体
因为
我是一个诗人
#include <windows.h>
#include <tchar.h> static BOOL WINAPI Handler(DWORD ctrlEvent);
static BOOL bExit = FALSE; int main(int argc, char *argv[])
{ if (!SetConsoleCtrlHandler(Handler, TRUE))
{ LPTSTR lpvSysMsg; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpvSysMsg, 0, NULL); _tprintf(_T("设置事件句柄时出错: %s\n"), lpvSysMsg); } while (!bExit) { _tprintf(_T("不断输出不断输出...\n")); Sleep(1000); } return 0; } BOOL WINAPI Handler(DWORD ctrlEvent) { bExit = FALSE; switch (ctrlEvent)
{ case CTRL_C_EVENT: _tprintf (_T ("你按了CTRL+C\n")); return TRUE; case CTRL_BREAK_EVENT: _tprintf (_T ("你按了CTRL+BREAK\n")); return TRUE; } } 2006/9/12 Windows Data Types
来源:MSDN The data types supported by Microsoft® Windows® are used to define function return values, function and message parameters, and structure members. They define the size and meaning of these elements. The following table contains the following types: character, integer, Boolean, pointer, and handle. The character, integer, and Boolean types are common to most C compilers. Most of the pointer-type names begin with a prefix of P or LP. Handles refer to a resource that has been loaded into memory. For more information about handling 64-bit integers, see Large Integers. Data Types
2006/8/30 难以理解的错误今天我的程序出现了这个问题,比较绕:
A程序:建立了一个AppDomain, 在这个AppDomain中调用一个MarshalByRefObject的子类---B类
然后,我将A程序写入字节流保存
C程序将A程序从字节流中还原,并动态调用A程序中的方法,这时将报A程序中的B类无法加载的错误 一句话就是,反射调用的程序集中的其它应用程序域中的类无法调用
(为什么是其它应用程序域?因为A程序中的默认应用程序域中的其它类我都可以调用。)
看来序列化(MarshalByRefObject)有很多限制
这只是初步的想法,还需要证实一下 -----------------------------------------------------
解决了:
我把
AppDomain.CreateInstanceAndUnwrap(Assembly.GetCallingAssembly().FullName, typeof(TargetType).FullName);中的
Assembly.GetEntryAssembly()
换成了
Assembly.GetCallingAssembly()
不过又出现了无法将透明代理转换为目标类的错误,不过这下总算放心了
2006/8/27 得到PE文件信息 (下)三、使用函数: 首先使用imagehlp.dll中的函数MapAndLoad 函数MapAndLoad将一个映像文件映射到虚拟地址空间中,并填充结构LOADED_IMAGE 定义如 下BOOL MapAndLoad( IN LPSTR ImageName, IN LPSTR DllPath, OUT LOADED_IMAGE LoadedImage, IN BOOL DotDll, IN BOOL ReadOnly ); 另外还有相对应的函数UnMapAndLoad 为了由相对虚拟地址得到虚拟地址,使用ImageRvaToVa: LPVOID ImageRvaToVa( IN IMAGE_PE_FILEHEADER NtHeaders, IN LPVOID Base, IN DWORD Rva, IN OUT IMAGE_SECTION_HEADER *LastRvaSection ); 这个函数返回的是虚拟内存地址 四、得到导出名(VB代码仅供示例,无法运行):
'LOADED_IMAGE结构定义如下:
Public Type LOADED_IMAGE '48个字节 ModuleName As Long hFile As Long MappedAddress As Long '映射文件基址 pFileHeader As Long 'IMAGE_PE_FILE_HEADER的指针 pLastRvaSection As Long '第一个COFF段文件头的指针 ?? NumberOfSections As Long pSections As Long '第一个COFF段文件头的指针 Characteristics As Long '映像特征值 fSystemImage As Byte fDosImage As Byte Links As LIST_ENTRY '2个长整型 SizeOfImage As Long End Type '检查&H3C偏移处是否为&H4550(PE文件标记)
Get #fr, &H3C+1, bSigOffset Get #fr, bSigOffset+1, iSignature If Not iSignature = &H4550 Then '非PE文件 Close fr Exit Function End if '将文件映射到内存,并填充LOADED_IMAGE
Dim loadimage As LOADED_IMAGE lret = MapAndLoad(sFile, "", loadimage, True, True) '得到映像的基址
baseaddr = loadimage.MappedAddress '将PE头复制到我们自已的变量peheader中
Dim peheader As IMAGE_PE_FILE_HEADER CopyMemory ByVal VarPtr(peheader), ByVal loadimage.pFileHeader, 256 '由第一个数据目录的相对虚拟地址得到虚拟地址
rvaExportDirTable = peheader.OptionalHeader, DataDirectory(IMAGE_DIRECTORY_ENTRY_EXPORT).RVA vaExportDirTable = ImageRvaToVa(loadimage.pFileHeader, loadimage.MappedAddress, rvaExportDirTable, 0&) '将导出表复制出来
Dim exportdir As IMAGE_EXPORT_DIRECTORY_TABLE CopyMemory ByVal VarPtr(exportdir), ByVal vaExportDirTable, LenB(exportdir) '现在exportdir.ExportNamePointerTableRVA是这个导出名指针表的相对虚拟地址,我们转成虚拟地址
ExportNamePointerTableVa = ImageRvaToVa(loadimage.pFileHeader, loadimage.MappedAddress, exportdir.ExportNamePointerTableVa, 0&) '输出导出表
pNextAddress = ExportnamePointerTableVa '从起点开始 VBGetTaget lNextAddress, pNextAddress, 4 '得到下一个地址 For i=0 To exportdir.NumberOfNames '将该名称地址由相对虚拟地址转为虚拟地址 lNextAddress = ImageRvaToVa(loadimage.pFileHeader, loadimage.MappedAddress, lNextAddress, 0&) sName = LPSTRtoBSTR(lNextAddress) '将ANSI转为BSTR,得到名称 pNextAddress = pNextAddress + 4 '指向表的下一个地址 VBGetTarget lNextAddress, pNextAddress, 4 '得到地址 Next '最后调用UnMapAndLoad 得到PE文件信息 (上)一、PE文件格式:
'没有MS-DOS占位程序的PE文件头
Public Type IMAGE_OPTIONAL_HEADER '232个字节 'Windows字段 '数据目录(数据索引表) '数据目录
2006/8/14 C#泛型-小心使用静态成员变量旧贴转过来:
对于泛型类的声明
其中使用类型参数的构造类型,比如List<T>被称为开放构造类型(open constructed type) 而不使用类型参数的构造类型,例如List<int>被称为封闭构造类型(closed constructed type)。 特别要强调的是不同类型参数的封闭构造类型之间是不共享静态成员变量的。 举个例子 using System; public class List<T> public T Value public int ClosedCount public static int StaticCount
public class Test List<double> list2 = new List<double>(0.618); List<string> list3 = new List<string>("divino"); Console.WriteLine(); Console.WriteLine("List<double> Count: {0}", List<double>.StaticCount); 输出结果: List<double> Count: 2 其中:
2006/7/31 X的悲剧和Y的悲剧最近一口气看完了X的悲剧和Y的悲剧
这是奎恩的推理名篇 这两个小说的共同之处
就是都有一个无法想到的凶手 这个凶手属于不被人关注的角落角色 所以当我看到迷底时被深深震撼了 而这种震撼 是不同于看了行人的馆系列后的被骗之感 是彻底的折服和赞叹 同Y的悲剧相比
X的悲剧更有可读性和故事性 所以非常具有阅读时的吸引感 和可重复阅读性 当小说已经进入尾声
而我仍还在云里雾里 当看雷恩化妆成死者隆斯崔戏剧性的抓到凶手后 我真是被突然出现的凶手震撼 原来是他,那个角落角色 我无论如何无法想到 而雷恩早在隆斯崔被杀后就知道了 我却没有注意到那个细节 Y的悲剧的故事性相比就逊色一些
奎恩故意把让读者引向了错误判断: 凶手误杀错了人、死者儿女们的遗产纠纷 以及那位值得怀疑的身份的家庭教师 在最后,雷恩说凶手已经死了,并揭露迷底时 我被压抑了几章的不爽之感彻底喷发 由此Y的悲剧更像是黄金时代的推理小说 (本来就是黄金时代的推理小说) ----用19章的压抑换来一章的畅快 现在我非常期待奎恩的另一名篇 希腊棺材之谜 2006/7/24 Endless Sadness上次看完NANA
我的心理就出现了问题
今天又听到Endless Story
NANA的插曲
我觉得比中岛的Glamorous Sky有力量多了
青春的残酷
辗转迷茫
温暖而坚定
全部浸入在那曲子的每个音符中
我的心理就又出现了问题
莲
是不是因为追逐而放弃的太多了
if you haven't change your mind
想要你在身边 tonight 早已疲倦了逞强 曾经太过年少 everytime i think about you baby 直到现在才能说出口 i miss you it is hard to say i'm sorry 不为任何人 只为你 唱这首歌 永不完结的story延续在这光芒之中 always 想要告诉你 memories of our time together 不要忘记 留在此刻 don't go away 用温暖融化 只为了确定 点滴的温柔 泛起心中的涟漪 如此的痛苦 i'm missin'you 握紧的手 不要放开 如果可以 希望再次为你 唱这首歌 永不完结的 story 从未消逝的想念 tell me why 请告诉我 直到永远 |
|
|