TwitterTwitter FacebookFacebook FlickrFlickr RSSRSS

20100513

让bsodhook检查任意hook

bsodhook检查任意hook

BSODHOOK非要开个驱动检查SHADOW TABLEssdt table
没有HOOK的就不让检查,于是写了个驱动让他能检查任意SSDT/SHADOW HOOK~
先打开bsodhook,load driver,再加载这个驱动即可

要检查的HOOK ID请在need_check_ssdt_id need_check_shadow_id里填写~
已测试版本 2.0.0.0

代码:
=================================


#include "ntddk.h"
#include "stdafx.h"
#include "zwfunc.h"
#include "ntifs_48.h"

ULONG oldBsodHookDevCtl ;
ULONG need_check_ssdt_id[] = {0x1 , 0xffffffff};

ULONG need_check_shadow_id[] = {0x1001,0xffffffff };

NTSTATUS NewBsodHookDevCtl(PDEVICE_OBJECT devobj , PIRP irp)
{
NTSTATUS stat ;
PIO_STACK_LOCATION irpstack = IoGetCurrentIrpStackLocation(irp);
ULONG iocontrolcode = irpstack->Parameters.DeviceIoControl.IoControlCode;
PVOID userbuffer = irp->UserBuffer;
ULONG len = irpstack->Parameters.DeviceIoControl.InputBufferLength ;


__asm
{
push irp
push devobj
call oldBsodHookDevCtl
mov stat ,eax
}

if (!NT_SUCCESS(stat))
{
return stat ;
}

//irp
已经完成了~

//
这里是get ssdt
if (iocontrolcode == 0xB50D800B)
{
__try
{
ULONG i = 0 ;
while(need_check_ssdt_id[i] != 0xffffffff)
{
*(ULONG*)((ULONG)userbuffer + need_check_ssdt_id[i] * 4 + 4 ) = 0xffffffff;
i++;
}

}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return stat ;
}
}
//
这里是get shadow ssdt
else if (iocontrolcode == 0xB50D800F)
{
__try
{
ULONG i = 0 ;
while(need_check_shadow_id[i] != 0xffffffff)
{
*(ULONG*)((ULONG)userbuffer + (need_check_shadow_id[i] - 0x1000) * 4 + 4) = 0xffffffff;
i++;
}

}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return stat ;
}
}

return stat ;

}
NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistry )
{
UNICODE_STRING Name ;
PDRIVER_OBJECT DriverObject ;
NTSTATUS stat ;


RtlInitUnicodeString(&Name , L"\\Driver\\BSODhook");

stat = ObReferenceObjectByName(&Name ,
OBJ_CASE_INSENSITIVE,
NULL,
0,
*IoDriverObjectType ,
KernelMode ,
NULL,
&DriverObject
);

if (!NT_SUCCESS(stat))
{
return STATUS_UNSUCCESSFUL ;
}

oldBsodHookDevCtl = DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL];
InterlockedExchangePointer(&DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] , NewBsodHookDevCtl);

ObfDereferenceObject(DriverObject);

return STATUS_SUCCESS ;

 

20100511

Implementing thread-safe unordered sets without reducers

 

Implementing thread-safe unordered sets without reducers

Submit New Article


by Alex Zatsman

Races and Reducers: the Risks and Rewards

One of the biggest challenges in building a parallel program is dealing with data races. Cilk++ offers several tools and techniques to find and eliminate races from your program. Reducers provide a a powerful mechanism for eliminating races, but as Spiderman said, "with great power comes great responsibility."

The Problem

I recently looked at a customer problem that at first looked like an obvious application for reducers.  Briefly, the task was to sort a collection of objects into separate bins based on certain properties of the objects. The simplest parallel implementation, converting the for loop to a cilk_for loop, introduces data races on the bins if two or more objects can be put into the same bin.

At first look, this seemed like a good opportunity to use reducers.  The contents of each bin is a list of elements, so why not just have each bin hold a list reducer?  Reducers are extremely efficient when used sparingly, but unfortunately can become expensive if you create thousands or even millions of reducers, as would be needed in this case.

The other safe approach to handling races is to use locks to protect access to the shared memory locations.  In this case, that would either mean using a single lock to protect the entire collection (safe, but bad because the high contention on this lock would eliminate all advantages of parallelism) or to create and acquire a lock for each bin (also safe, but bad because it requires thousands or millions of expensive locks.)

Luckily, there is another way.

The Approach

Mutex locks provided by the operating system are expensive to create and acquire, and are generally more heavy weight than is required for this problem. However, there is a much lower-cost alternative. The underlying hardware offers atomic instructions, which are effectively locks around single hardware instructions. These are the same instructions that are used to implement mutexes, but we can use them directly to save a significant amount of overhead for our problem at hand. It is important to note that there is no free lunch - atomic instructions require a memory barrier that can cost 40 or more instruction cycles.  This is far more expensive than the few cycles used by an unlocked read/write, but still much less than the thousands required to create and acquire mutexes. You can think of these as small locks that lock just the read/write hardware operation to ensure that no other processor can race on the memory between the read and the write.

My approach is to use the atomic instruction to safely update the bins in a way that will not create data races. As with any use of locks, this approach prevents data races, but does not guarantee a deterministic result.  In this case, each bin will hold the correct list of elements, but the order of the elements in the list is indeterminate.

The Solution

An atomic swap operation for pointers is available under different names in both Gnu and Windows C/C++ compilers:

GNU: __sync_lock_test_and_set
MSVC: InterlockedExchangePointer

An implementation of a thread-safe sets can be implemented as a template with the class C of the set element as the template parameter:

#ifdef __GNUC__
#include
#define AtomicSwap(A,X) __sync_lock_test_and_set (A, X)

[How to solve the linking errors when using the ATOMIC functions?]

[How to solve the linking errors when using the ATOMIC functions?]

When some new atomic functions of GCC are used in the i386 platform, the linking errors maybe take place. It takes me troubles in some time even if I have updated GCC to the latest version (GCC-4.3.3). Herein, I will give my solution to overcome it, and share the experience with you in the Linux OS.

<!--[if !supportEmptyParas]--> <!--[endif]-->

[How to know whether your machine is i386?]

Please use 'uname' command to disclose your hardware platform.

$ uname -i

i386

<!--[if !supportEmptyParas]--> <!--[endif]-->

[What are the atomic functions?]

1. __sync_add_and_fetch()

2. __sync_sub_and_fetch()

3. __sync_lock_test_and_set()

4. __sync_add_and_fetch()

<!--[if !supportEmptyParas]--> <!--[endif]-->

[How to compile your source codes in the i386?]

It is a critical stage to get rid of the linking errors. Maybe you have known, these functions are provided by GCC (Not glibc), so the special compiling option must be added at the compile step. For example:

gcc -o atomic.o -c -fvisibility=hidden -march=i486 -Wall -pthread -O3 -fPIC atomic.c

Do you find the RED-BOLD part? Yes, it is a key option! If you have met troubles to link these files using atomic functions, please confirm whether '-march=i486' has been added.

<!--[if !supportEmptyParas]--> <!--[endif]-->

After compiling, are you happy? I guess that it is true! Haha!.

<!--[if !supportEmptyParas]--> <!--[endif]-->

[Summarization]

Open-Source is a big platform including huge information/tools…, so the accumulation plays very important role in the daily activities. The trivial points of knowledge should be tidied when you have spent much time in finding the root causes. Meanwhile, if it can help freshmen touching this field, its value is represented.

<!--[if !supportEmptyParas]--> <!--[endif]-->

20100505

"門票100元以下"或免費的好地方

"�票100元以下"或免�的好地方!!

地� �用 �� 地址
宜�牧羊� 10 03-9567724 宜��冬山�柯林村�春路239巷17�(9:00~18:00)
金�宜�威士忌酒堡 0 03-922-9000 宜���山��山路二段326�
宜��治�念� 20-30 03-9326664 宜�市�城南路力行3巷3�
��林� 0 03-954-511403 宜�����中正北路118
礁溪八路�神� 0 03-9873858 宜��礁溪香礁溪路三段106�
老�夫生�休��� 30-50 2493-0266 台北��溪��行村丁子�坑 50 �
清香�� 50 2790-3466 台北市�湖�大湖街206�
中正�念堂 0 2343-1100~3 台北市中正�中山南路21�
�父�念� 0 2758-8008 台北市信��仁�路4段505�
�立台�博物� 10-20 2382-2566 台北市中正�100襄�路二�(228和平公��)
�政博物� 3-5 23945185 ext 811 台北市重�南路二段四十五�
黑松博物� 0 2752-5589 台北市��南路一段39�「微���」B�(��建�物)2F
台北市防�科�教育� 0 2791-9786 台北市�湖�成功路二段376�
富�自然生�公� 0 2700-3830 台北市��街272巷的�路旁
博嘉��公� 0 2239-5494 北市文山�木�路4段159巷16�
台北探索� 0 2757-4547 台北市市府路一� (仁�路西大�)
台大蔬果�� 30 8712-5598 #13 台北市芳�路51�
社子花卉�� 0 28101969 台北市士林�延平北路7段18�之2 1�
士林官邸 0 28812512 台北市士林�福林路60�
至善� 20 2881-2021 台北市士林� 外�溪至善路二段211�
林�堂故居 25-30 2861-3003 台北市仰德大道二段141�
��谷�客服�站 0 2893-5580 台北市北投�泉源路200�
台北捷�逃生��� 40-50 218-12345 台北市北投�大�路527巷88�
北投�泉博物� 0 2893-9981 台北市北投�中山路二�
���北投分� 0 2897-7682 台北市北投�光明路251�
��花�景�餐� 50 2898-6256 台北市北投���路65�之8
台北�渡� 0 2858-1281 北市北投�知行路360�
��天元� 0 2621-2759 台北�淡水�水源里北新路三段30�
大屯花卉�� 0 2622-1723 台北�淡水�水源里泉州厝26-3�
�尾�台 20 2629-5390 �北�淡水�中正路一段6巷34�
�毛城 40-60 2623-1001 台北�淡水�中正路28巷1�
小白� 40 2628-2865 �北�淡水�真理街15�
�寮海�公� 90 2490-2991 台北��寮�研海街45�
福隆海水浴� 90 2499-2381 台北��寮�福隆村�隆街36�
��露�渡假基地 70 2499-1791~3 台北��寮�福隆村�隆街100�
金山�神� 0 2498-1186 台北��里�磺潭村公��52之2�
李天�布袋�文物� 100 2636-9174 台北�三芝�芝柏路26�
三芝名人文物�   8635-3640 台北�三芝�埔�坑164-2�
八�溪生�教育�� 0 86352875 台北�三芝��山村3��柑宅24�
三芝水�公� 0   台北�三芝�
肥前屋牧� 100   台北�三芝����休�渡假村附近
板�河�公� 0   台北�-位在�江�水�外
中和休��� 用餐 2947-2600 台北�中和市�南路三段110�
中和四�公� 0 2926-6888 台北�中和市中安街八十五�
牛�糖博物� 0 2268-7222 台北�土城市自�街31-2�
牛伯伯安康��蝴蝶生�教�� 0 2211-0961 台北�新店市安坑柴埕路104�
新店五路�神� 0 2217-7703 台北�新店市竹林路167-2�
碧潭�景� 0 2913-1184  
十分旅�服�中心 0 2495-8409 台北�平溪�南山村南山坪136�
菁桐太子�� 100 0933-055281 台北�平溪�菁桐村菁桐街167�
石碇五路�神� 0 2688-6267 台北�石碇�永定村大湖格路20-1�
茶�博物� 100 2665-7251 台北�坪林�坪林街101�
熊空休��� 50起 0911-915950 台北�三��竹�里竹�路243-2�
三��月�森林��� 10-100 2672-0004 台北�三��有木里174-1�
�金博物�� 100 2496-2800 �北�瑞芳�金瓜石金光路8
�歌陶瓷博物� 50-100 8677-2727 台北��歌�文化路200�
航空科�� 25-30 03-398-2179 桃��大��埔心村航站南路5�
迎富送�� 0 03-3889355 桃��大溪�瑞安路2段205�
大溪天公祖�五路�神 0 03-388-9355 桃��大溪�康�路三段10巷18-6�
花�了休��� 0 03-3879195 桃��大溪���路二段329�
�情故事� 0 03-387-1566 桃��大溪���路1段1037�
�和音����

��洽�例假日��

0 03-3882215~7 分�10 桃��大溪�信�路226�

DIY半日�:200元,一日�:400元

金�食品展�� 0 03-380-1226 桃��大溪�介�路236�(15人以上����)
慈湖陵� 0 03-3883552 桃��大溪���路一段1097�
羊世界教�休�牧� 50 03-4266987 桃��中�市民�路三段382巷1-5�
�光花�幸福�� 0 03-4616077 桃��中�市�中�路651�
中��幼� 0 03-4015685 桃��中�市五�里正大街55�
白木屋品牌文化� 0 03-4965558 桃���梅�高�路813巷22弄6�
雅�魅力博�� 0 03-4883800 桃���梅�中山北路1段21巷1�
郭元益糕�博物� 0 03-4643545�1 桃���梅�幼�工��青年路9巷1�(事先����)
�光森林富野�羊牧� 100 0987-658009 桃�����霞�村3�志�19�之2
�美南���� 0 03-3222709 桃���竹�南工路一段11�
林口酒� 0 03-3283001 桃���山�文化一路55�
青林�� 0 03-4987747 桃���音�大堀村大湖路二段131-1�
�音�花�� 0 03-4737778 桃���音�中山路一段970�
向��� 0 03-4870629 桃���音��埔村11�52�
老��休��� 100 03-4890111 桃���音��亭路八德段675巷56-7�
新竹18尖山 0   新竹市�南郊
新竹市立�物� 10 03-522-2194 新竹市公�路279�
小熊烘焙屋 50 03-5726228 新竹市��大�路212�
��模型�列� 20 03-5424102 新竹市�大路三段110巷15�
新竹香山�地 0   新竹市十七公里海岸�景�
新竹新月沙� 0   竹北市��路五段155巷通往新月沙�海�的路
薰衣草森林 100 03-5841193 新竹�尖石�嘉�村嘉�130�
�家�� 0 03-5890982 新竹�新埔�照�里九芎湖7�1�
九芎湖休���� 0 03-5899625 新竹�新埔�九芎湖15-1�
巨埔休��� 0 03-589-9523 新竹�新埔�巨埔里12�63�
新竹��林�展示� 0 03-5224163-129 新竹��山���村大同路11�
新竹�西的金勇蕃茄� 0 03-5870899 新竹��西��光里 16 � 2 � 35-1 �
青境花墅 用餐 03-5478839 新竹��西��山里9�97-1�
三�木雕博物� 50-80 037-876009 苗栗�三���盛村��新城88�
火炎山森林生�教育� 0 037-878851 苗栗�三��中正路73�
三�九�山大�善寺 0 037-877465 苗栗�三��西湖村七�上湖25-8�
三�客家�院 0   苗栗�三��三���潭村�潭社��
苗栗���站.���� 0 037-870-435 苗栗�三����村14���89�
糕��童玩村 0 037-878966 苗栗�三��伯公坑178�
��流�文� 0 037-911286 苗栗�西湖�五湖村14�194之4�
�恩�古宅彭城堂 0   �人��之一日�活�,�客自行��跟�前��,洽���:(037)921515���-���

或0912-054010蔡先生-$800半天��

四方牧� 50 0800-266489 苗栗�竹南�崎�里�崎�9-6�
山居印象�� 100 04-25898866 苗栗�卓��西坪里3�西坪33-1�
花露香水休��� 100 04-25891589 苗栗�卓��西坪里西坪43-3�
薰衣草森林 100 037-252000 苗栗��屋�明德村20�仁隆64
台�水牛城 0 037-732097  苗栗�後���坑里17�十班坑181-11�
通霄精�� 0 037-792121 苗栗�通霄���里122�
石��火�餐� 0 037-792399 苗栗�通霄�白西里19�153�之8
�湖�� 0 037-932-658 苗栗��潭�台3�百�隧道110公里�
台�美��(�童��室) 0 04-23723552 台中市西�五�西路一段2�
益健乳羊牧� 0 04-24618321 台中市西屯�林厝里西平南巷22�
台中科博� 20-100 04-23226940 台中市北��前路一�
台中�童��� 80-100 04-24862948 台中�大里市�利二路1�
�箱王�意�� 用餐 04-22398868 台中市北屯��子里�子巷5-8�
石�土牛客家文物� 0 04-25825312 台中�石��土牛村德成巷10�
沙鹿�福� 0 04-26352551 台中�沙鹿�福幼街8�
薰衣草森林 100 04-25931066 台中�新社�中�街20�
��客家文物� 0 04-25881440 台中����中山路1�
921地震教育�� 0-50 04-23390906 台中��峰�坑口村中正路46�
日月山景休��� 0 04-737-0949 彰化市水月台路218�
禾家牧� 0 04-7385656 彰化市石牌里石牌�7�78�
��合作�� 100 04-8991345 彰化�芳苑���村大同路511巷46�
人���博物� 0 04-7813888�71190 彰化�鹿港�鹿工路6�
白�氏健康博物�   04-7810077 彰化�鹿港�彰�工��鹿工路18�
台�玻璃� 0 04-781-1299 #266 彰化�鹿港�鹿工南四路30�
溪州公� 0 04-8899812 彰化�溪洲�中央路3段138�
彰化溪湖糖� 0 04-8855868 彰化�溪湖�彰水路二段762�
蜜蜂故事� 0 05-5828255 �林�古坑��子路88�(�色隧道旁)
日光水色 用餐 05-5901657 �林�古坑��山村�山路19-10�
�情公� 0   南投市中�新村中正路2�
宏基蜜蜂生��� 0 049-2980851  南投�埔里�枇杷路52-1�
台�工�文化�� 0 049-2334141 南投�草屯�中正路573�
�角仙�� 0 05-203-0666 嘉��中埔�石�村15�45�
�盈�� 50 05-2538505 嘉��中埔���村4�2-3�
�石�人�� 0   嘉���石�
台南�福� 60-90 06-2999381 台南市安平�中�西路2段315�3.4�
七股�山 0-100 06-7800511#49 台南�七股��埕村66�
奇美博物� 0 06-2660808 台南�仁德�三甲村59-1�
仙湖休��� 100 06-68636635  
虎�埤�景�管理所 0-80 06-5901325 台南�新化�中�路42巷36�
新化�家植物� 80 06-5901075 台南�新化�知�里口碑76�
天�湖�保水上公� 0   台南�新�市埤寮里
牛埔泥岩水土保持教��� 0 06-268-4367�101 台南��崎�牛埔村
台�美文化� 0 07-312-9216�106   高雄市三民�十全一路161�7�
�立科�工�博物� 100 07-3800089  高雄市三民�九如一路 720 �
客家文物� 0 07-315-2136~8 高雄市三民�同盟二路215�
而�幼稚�附�文物� 0 07-345-4155 高雄市三民�明仁路85�
青溪文物� 0 07-372-5921  高雄市三民�武功巷52�
高雄�景� 0 07-235-9751 高雄市三民�建�二路318�
�童美�� 0 07-555-0331 �300 高雄市鼓山��卡道路330�
前清 打狗英��事� 0 07-525-0271 高雄市鼓山��海路20�(十八王��旁)
高雄�山�物� 20-40 07-5215187 高雄市鼓山���路350�
�明高雄海洋探索� 20-30 07-5716688 高雄市旗津�南汕里北汕巷50-61�
上���中心 0 07-533-1755 高雄市�埕�大勇路11�7�
高雄市立�史博物� 0 07-531-2560 高雄市�埕�中正四路272�
高雄市�影��� 0 07-5511211   高雄市�埕�河西路10�
�埕文化�� 0 07-561-5633 高雄市�埕�莒光街197�
�新��童教�牧� 100 07-7921898 高雄�大寮�上寮村大仁街上
空��史� 0 07-625-4167 高雄��山�介�西路西首1�
皮影�� 0 07-6262620 高雄��山��山南路42�
�嘉�� 35 08-7992221 屏��三地���嘉村�嘉巷120�
三地�文化� 100 08-7992321 屏��三地��三地村中正路2段110�
�石男女生����� 100 08-7626672 屏���治�繁昌村天主巷13
中原世�教�牧� 0 08-7789517 屏���丹�竹林村竹�街160巷59�
�流森林��� 100 08-8701394 屏���子�丹路村丹路223
初鹿牧� 100 089-571002 台��卑南�明峰村牧�1�

20100502

錢只是工具



錢只是工具
這是炎熱小鎮慵懶的一天。太陽高掛,街道無人, 時機歹歹,每個人都債臺高築,靠信用度日。
這天,從外地來了一位有錢的旅客,正開車通過鎮上。他在一家汽車旅館前停車,進去後,拿出一張 1000 元鈔票放在櫃台,說他想先看看樓上的房間,挑一間合適的過夜。
就在該名先生上樓的時候,店主抓了這張 1000 元鈔,跑到隔壁屠戶那裡付了他欠的錢。屠夫有了 1000 元,橫過馬路付清了欠豬農的錢。 豬農拿了 1000 元,奔向飼料和燃料供應商,也付清了他欠的錢。那個在農會做事的老兄,拿到 1000 元,趕忙去付清他召妓的錢(經濟不景氣的時候,當地的服務業也不得不提供信用服務)。有了 1000 元,這名妓女衝到旅館付了她所欠的房間錢。旅館店主把這 1000 元放到櫃檯上,以免旅客下樓時起疑。
此時這位旅客下樓來,拿起 1000 元鈔票,聲稱客房沒一間滿意的,他把錢收回,塞進口袋,走了。
這一天,表面看起來,沒有人生產了什麼東西,也沒有人得到任何東西。 但是現在全鎮的債務都清了,而且以更樂觀的態度面對未來。

各位女士先生們,錢就是要這樣流通。

 




--
--
owen

20100430

FW: 四十以後一定要明白


四十以後一定要明白:好朋友是應該相互欣賞,而不是相互利用。好朋友只能在同一階
層中產生,而窮人和富人,百姓與達官,草根與明星,白丁與學者則永遠也成不了真正
意義上的朋友。因為不在同一階層,便永遠也不會有對方對本階層的深刻體會與感悟。

四十以後一定要明白:飯應該一口一口的吃,事要一點一點的做。沒有一蹴而就的事
情,所以就不應該疲於奔命。中年,應該活得從容自在。

四十以後一定要明白:任何事物都是有雙重性質的,有時候甚至沒有對錯,你以為錯
的,在別人看來或許是對的。而你竭盡全力為之奮鬥的目標,卻很有可能正是別人想擺
脫和拋棄的贅物。

四十以後一定要明白:生活品質的優劣,完全取決於自己的慾望。修饈美味,觥籌交錯
間如果掩飾的是爾虞我詐,則遠不如"三五知己坐,淡茶話家常"來得可心。如果高官
厚褥卻窮于心智,惶于任途,就遠不如"采菊東籬下,悠然見南山"活的逍遙。

四十以後一定要明白:我們的伴侶看似平淡無奇,有些時候甚至難以忍受,其實歲月的
年輪早已將彼此交融在一起了,即使惡習劣性,也已成為自己生命的一部分。如果有一
天你真的撕毀這不堪的婚姻,就會發現每撕一片都會連著自己的皮肉和筋骨。

四十以後一定要明白:我們對孩子溺愛就像高脂高糖一樣危害著他們的健康,我們害怕
他們走歪路。我們擔心他們吃苦受罪,我們憂慮他們經風雨。我們全家人為他們搭起了
大廈,然後癡傻呆呆地望著他們柔弱的發育。

四十以後一定要明白:對待父母再不可做薄養厚葬的傻事了,他們那一輩子受的磨礪太
多了,善待他們就是善待我們的良心。說起善待父母都很心疼錢的,但要動動腦筋事情
就會圓滿的完成;比如,可以去酒店訂一份極品燕窩湯,端回家告訴父母說是在小攤上
買的2元一碗的銀耳湯,然後看著他們幸福的享用,其實大多的時間他們根本就不需要
你的榮華,每週問他們一個年輕時候的故事,然後聽著他們講完就很知足了。

四十以後一定要明白:職位只不過是一個杯子,而你的修養和品性才是杯中的尤物,夜
光杯中盛的未必就是葡萄美酒,也可能是一杯濁水,粗瓷盞�不見得就是白開水,很可
能是泡的一盞極品龍井。個中的品質全在自己的心境造化!!!

每個女孩都是公主


三八節,我們的三項紀律八項注意



西方有諺語,每個女孩都是公主(Every girl is a princess);《紅樓夢》裏賈寶玉

說,女兒是水做的骨肉,男兒是泥做的骨肉。因此,身爲一個女性,絕對是一件值得驕

傲的事情,所有的女人都值得被珍愛,這是一條真理。



但是,被珍愛也有前提,那就是你值得被珍愛。因此,你就得有值得人愛的特質,譬若

溫柔、善解人意、寬容、美麗……不管歲月如何老去,你都不能草率地對待自己。你就

得做得比男人還出色,有蠱惑男人的魅力,也有掌握世界的能力;能欣賞漂亮的笑話,

也能像男人一樣聳聳肩,轉身就走,自己掌握命運。



作爲"三八節"的節日禮物,我們送給你身爲女人的"三項紀律八項注意"。希望它能


幫助你消除沮喪,不三八不淪落,給周圍人帶去快樂的同時,牢牢記住,"做一個女

人",是你一輩子的事業!



幸福女人的三項紀律



No.1 一個人不寂寞



一次,台灣著名的"大女人"陳文茜接受鳳凰衛視的采訪,主持人問她,單身女人老了

後是不是會很寂寞。陳文茜回答道:"不會。"她接著說:"老了以後你永遠可以給自

己不斷地去找更老的人。"她以自己的故事舉例,當年在台大念法律系的時候,她發現

台灣的女人一旦出嫁了,要以丈夫的住所爲住所,以丈夫的姓氏爲姓氏,如果沒有特別

登記,所有的財産都是男方的,離婚的時候連小孩也多半判給男方。女人出嫁了以後只

有一個多出來的權利,就是丈夫死了妻子可以繼承財産。所以,當時陳文茜說:"我最

想嫁的人是辜振甫,因爲他是台灣最有名的,最老的,最有錢的,又最有氣質的人。"

當時辜振甫70多歲。20多年過去了,2005年初辜振甫病重,陳文茜去醫院看他,偷偷在

辜振甫耳邊跟他講了這個笑話。她說:"您知道嗎,您是我一生唯一真正想嫁的男人,

因爲您沒有娶我,所以就誤了我的一生。" :



陳文茜回憶這件事時說:"哇,當時辜振甫一聽好高興,因爲他近90歲,在他眼

中,我怎麽說都是一個可愛的小女孩。所以單身女人不用怕老。"



更何況,對于大多數人來說,一生中,單身的日子總是相對短暫的,不如趁著那個最適

合你的人還沒出現的時候,多培養一些自己的興趣,學會多愛自己一些,大S說得好,

小時候,她覺得妹妹比自己好看,但現在人人都贊她比小S好看,那是因爲她把妹妹用

來對付男人和小孩的時間都用來照顧自己了。





No.2 兩個人要快樂



愛情發生的一刻總是如電火雷鳴,天地都被你們的愛照亮。但可惜,愛情從來就是一件

瘋狂的小事,不會持續得如你所願得那麽久。你開始抱怨他不再浪漫,不再願意像從前

那樣時刻相伴左右,你開始懷疑是否他還愛你一如往昔,你挑剔所有的細節,變得越來

越壞脾氣,直到他大聲地呵斥你,你既然那麽不快樂,爲什麽還要和我在一起?



親愛的,你可以要浪漫,但是必須要有智慧和韌性去創造浪漫。要知道追求愛與創造浪

漫本來就是與女人的生命緊密相連的能力,男人在這方面從來都是弱者。與其等待男人

來給浪漫,不如親手去打造浪漫的氛圍。如果你總是渴望世界能給你更多,那你注定會

得到失望的結局。如果你在這段關系裏致力于鋪陳驚喜,那麽你得到的回饋一定會讓你

感覺幸福和甜蜜。



要記住,好女孩最容易犯的錯誤就是以愛的名義進行"勒索"和"綁架"。如果你們相


愛,那麽就盡情享受當下的快樂吧,他不是你的小狗,也不是你的Bodyguard,沒有義

務24小時守在你身邊;更不要急著追問結果會如何,婚姻既不是一張長期飯票,也不一

定是幸福的同義詞。



你要時刻以張曼玉爲榜樣,她44歲,曾有過一次婚姻,目前與小她7歲的德籍建築師男

友定居北京。無論單身、結婚、離婚,再回複單身,她從來都是"最佳狀態的中國女

人"的代名詞。合則聚,不合則分。女人,可以爲愛走天涯,也可以隨時選擇放棄。



女人心,就是海底針,頭發可以短,眼神依然要意味深長,你的底牌只有自己知道!





No.3 三個人有自我



好了,恭喜你,終于走入了生命新的階段。爲人妻,爲人母,但是,等一下,爲什麽,


你卻變成了nobody,每個人看你的眼神都不再有愛意?照照鏡子,你就會明白,每天的

操勞和唠叨能把一個公主徹底地變成女仆!



好吧,雖然你做不到像維多利亞*貝克漢姆那樣天天變著花樣地換發型、換服飾、造新

聞,也沒法像楊瀾那樣擁有超人般的對事業與家庭的雙重駕馭能力;但是,你必須看清

現實,經營婚姻就如同打一場沒有硝煙的戰爭,你不能做anybody或nobody,你必須做

somebody。時時刻刻,你得表現出你作爲家庭"一把手"的自信和與衆不同。



作爲家庭的"一把手",切忌事事親力親爲,你必須要有相當的管理能力,讓家裏的另


兩位成員真正地參與到家庭的建設和發展中來,當然,這不是發號施令就可以做到的,

以柔克剛,四兩撥千斤才是女人的真本領。其次,一把手必須要有自己的事情,比如在

淘寶上開一家小店,絕對挑戰智力和體力,也絕對能讓你感覺有比收拾房間和看著孩子

寫作業更重要的事情在等著你去做!



一把手必須要有個人魅力,如果你不愛去美容院,那就跟著牛爾老師在家裏自制一些天

然面膜吧;如果你不屑于用名牌包裝自己,那也還得有一兩套相當能吸引眼球的行頭,

比如定做一件合體的旗袍,讓他能像結婚前那樣目不轉睛地看著你!



最後,記住,"一把手"必須有一把手的威嚴,盡管平時你總是讓他如沐春風,但是,

適時你也得讓他明白,你不會用"分手"或"離婚"當威脅,但是,如果他觸犯了你的


底線,你一旦說出口就絕對能做到。





收獲快樂的八項注意



No.1 注重健康,不對體重斤斤計較



健康是人生的基礎,年輕女孩子最容易爲了美麗而減肥,殊不知,不顧健康地盲目節食

或食用減肥藥物,只會破壞身體平衡,讓自己變成一棵失去水分的白菜,又何來美麗可

言。



買一張健身年卡,並且堅持一周運動一到兩次,由內而外煥發的健康光彩會讓你任何一

個角度看上去都很美麗。







No.2 學會理財,自己買花自己戴



最好還是趁早忘記那些"灰姑娘"的故事吧,盡早開始創建自己的財務系統,對一個姑

娘而言,絕對有百利。看看如今那些80後甚至90後創業的成功案例,相信你一定會爲自

己還在爲那些不切實際的情情愛愛浪費時間而後悔。就算你不具備創業潛質和欲望,打

理好自己的收入也是當務之急。對于從來不理財的菜鳥來說,不妨上網搜索一下"信封

理財法",盡管可能有些老套,但絕對有效!







No.3 突出重點,懂得穿戴的哲學



有調查顯示,全球女人中,英國女人最舍得在穿衣打扮上花時間和金錢。但她們這樣做

可不是爲了贏得男人的稱贊,而是想讓自己更自信,爲身邊人帶去快樂。而且她們絕不

是名牌的奴隸,在她們的衣櫥裏必定會有的是一頂貝雷帽、一套昂貴的黑色蕾絲內衣、

一件皮夾克、一條古董裙和一款精致的小手包。沒有女人是完美的,但每一個女人都可

以找到適合自己的一種款型。如果你自信在搭配上很有天賦,那麽建議你再參考一些色

彩搭配原理和技巧,然後把自己的個性和優點發揚光大吧!







No.4 孝順父母,讓父母以你爲榮



這是一個人盡皆知的秘密,但可能你還不知道:全世界最值得你付出愛的人不是你曾經

愛得死去活來的前任,也不是你結婚證上的那個人,而是總是被你忽略的父母大人。趁

早明白這個道理,可以讓你在年老之後少去很多愧疚和後悔。最直截明了的方法就是,

當你在安排自己的生活的時候,順手也將他們打包進你的計劃。







No.5 關愛他人



沒有任何事能比幫助他人更能讓人感到滿足了。你的付出不僅會讓世界變得更美好,也

會幫助你找到讓自己和他人都達到更好狀態的內在聯系。尋找機會參與公益活動,擔當

志願者都可以讓你有的放矢地將自己的愛心傳遞給需要的人們,這樣的經曆,甚至可能

改變你的人生觀,讓你從此獲得生命力量的源泉。







No.6 伺機逃離,旅遊開拓心胸



你累積了許多飛行,你用心挑選紀念品,你搜集了地圖上每一次的風和日麗。或許真如

歌中所唱的,因爲逃避一段失敗的感情,就是你旅行的意義。但是,沒有關系,就在一

次次旅行中,你開闊眼界,開拓心胸,你變得開朗、豁達,等你有一天,把所有風景都

看透,而那個願意陪你看細水長流的人就在下一個路口。







No.7 喜歡閱讀,有辦法讓心態平和



培根曾經說過:"讀書使人明智,演算使人精密,哲理使用人深刻,倫理學使人有修

養……總之,知識能塑造人的性格。"明智的意思,是讓人有理智,不致因爲一時沖


動,而喪失客觀地判斷事物的能力。但女人往往是過于感性的動物,所以,需要時常讀

書來讓你平衡容易起伏的心緒。







No.8 了解時尚,哪怕你不一定想擁有它



也許你是一個環保人士,從不穿皮毛,也不屑于提著Logo去上班。但是,這不妨礙你對

時尚有相當的了解和認知。事實上,時尚並非只是名牌的代名詞,時尚更是一種生活的

理念和態度,取精去蕪,才是聰明女人應該做的。當你能用時尚的態度對待自己的生活

時,相信你會活得更積極,更有活力!













JNI

JNI

出處

http://87showmin.blogspot.com/2009/06/java-java-native-interfacejni.html

 

JNI 是用來讓Java跟別種語言溝通的函式庫,如果我們舉C/C++ 為例,便分為C call JavaJava call C

Java call C

這段是參考[1]的第二章。

1. 建立一個 Java class (HelloWord.java)。在這個class裡宣告一個native method (print),然後在 main() 裡呼叫這個 method。此時,我們呼叫 printf() 時,它的實體是用 C/C++ 所寫的。

01.class HelloWorld {
02.    private native void print();
03.    public static void main(String[] args) {
04.        new HelloWorld().print();
05.    }
06.    static {
07.        System.loadLibrary("HelloWorld");
08.    }
09.}

上例中的System.loadLibrary("HelloWorld")會去找你程式目錄下的HelloWorld.dllHelloWorld.so,這之後會提到。

2. Compile HelloWorld.java,用javac指令。

3. 產生一個 native method 的 header file。

指令: javah -jni HelloWorld

這裡,我們用javah可以產生 .h 檔,接著就是實作這個 .h 檔的 .cpp,然後就可以 compile 成 .dll 或 .so 了。cpp 的範例如下:

01.#include <jni.h>
02.#include <stdio.h>
03.#include "HelloWorld.h"
04.  
05.JNIEXPORT void JNICALL 
06.Java_HelloWorld_print(JNIEnv *env, jobject obj)
07.{
08.    printf("Hello World!\n");
09.    return;
10.}

記得專案的設定中需指定好 jni.h 的目錄。如果是用VS系列的話,專案新增時選DLL版本,compile過後就會輸出HelloWorld.dll。

4. 最後,將HelloWorld.class跟HelloWorld.dll放在一起後,執行 java HelloWorld 就可以看到結果囉。

註: HelloWorld.dll 其實也不一定要跟 HelloWorld.class 放在一起,有個環境變數叫LD_LIBRARY_PATH,它便是用來設定 native library path。還有一種方式,就是利用java指令來指定路徑。下方是將路徑設為當前目錄。

java -Djava.library.path=. HelloWorld

C call Java

這段是參考[1]的第七章與其他收集的資料。

首先,我們用java寫一個 class Prog,請他印出些字,然後用javac去compile出 .class。

1.public class Prog {
2.    public static void main(String[] args) {
3.         System.out.println("Hello World " + args[0]);
4.    }
5.}

基本上這段程式是可以直接用java指令去執行的,但我們的目標是要產生一個 .c 檔來呼叫它,其流程大致如下:

  1. 喚醒 Java VM
  2. 載入指定class path下的所有 .class 們
  3. 找到你想要執行的class及其 method ID。
  4. 呼叫 method。

對照第七章的範例來看的話,步驟一加二的程式如下。舊版的JNI 有提供JNI_GetDefaultJavaVMInitArgs,新版的還是請大家自己乖乖指定好 class path 跟其他資訊。JNI_CreateJavaVM 會提供兩個重要的指標,jvm 是指向一個新開的JavaVM,env則是待會讓你用來對java class做怪怪事的介面。

01.JavaVMInitArgs vm_args;
02.JavaVMOption options[1];
03.options[0].optionString =
04.    "-Djava.class.path=" USER_CLASSPATH;
05.vm_args.version = 0x00010002;
06.vm_args.options = options;
07.vm_args.nOptions = 1;
08.vm_args.ignoreUnrecognized = JNI_TRUE;
09./* Create the Java VM */
10.res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

步驟三加四如下。

01.cls = (*env)->FindClass(env, "Prog");
02.if (cls == NULL) {
03.    goto destroy;
04.}
05.mid = (*env)->GetStaticMethodID(env, cls, "main",
06.                                "([Ljava/lang/String;)V");
07.if (mid == NULL) {
08.    goto destroy;
09.}
10.jstr = (*env)->NewStringUTF(env, " from C!");
11.if (jstr == NULL) {
12.    goto destroy;
13.}
14.stringClass = (*env)->FindClass(env, "java/lang/String");
15.args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
16.if (args == NULL) {
17.    goto destroy;
18.}
19.(*env)->CallStaticVoidMethod(env, cls, mid, args);

比較可能看不懂的地方是在GetStaticMethodID的第四個參數,這種詭異的寫法稱為JNI signature,當我們呼叫 Java method 時需要寫一些 signature,用來檢查你指定的型態是否與該 method 一樣。舉些例子好了。

Java constructor:

1.String s

對應到的signature為:

1.(Ljava/lang/String;)V

Java method:

1.String toString()

對應到的signature為:

1.()Ljava/lang/String;

Java method:

1.long myMethod(int n, String s, int[] arr)

對應到的signature為:

1.(ILjava/lang/String;[I)J

看了那麼多一定還看不懂對吧?基本上,一個函式會有參數值與回傳值,signature 的規則便是先用 () 描述參數值型態,後面再接回傳值型態。比較特別的,是如果有用到某個 package,除了要打出 package path 外還要加個分號!

下面列出其對應的所有規則,比較一下就可以知道了。

  • B=byte
  • C=char
  • D=double
  • F=float
  • I=int
  • J=long
  • S=short
  • V=void
  • Z=boolean
  • Lfully-qualified-class=fully qualified class
  • [type=array of type>
  • (argument types)return type=method type. If no arguments, use empty argument types: (). If return type is void (or constructor) use (argument types)V.

如果 method signature 不對的話,還會出現類似以下的錯誤訊息。

01.#
02.# An unexpected error has been detected by Java Runtime Environment:
03.#
04.#  Internal Error (sharedRuntime.cpp:552), pid=7304, tid=2492
05.#  Error: guarantee(cb != 0,"exception happened outside interpreter, nmethods and vtable stubs (1)")
06.#
07.# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
08.# If you would like to submit a bug report, please visit:
10.#

最後,你可能會想問:我要如何知道一個 Java class 裡的所有 method 到底需要哪幾種 signature ? 除了自己一個個看以外,J2SDK 有提供神奇指令來幫助我們!

javap -s -p classname

 

Reference:

[1] Java Native Interface: Programmer's Guide and Specification

[2] Invocation API of JNI Enhancement

[3] Creating a JVM from a C Program

[4] JNI Spec

 
PUMA螢光夜跑