按月归档: 4月 2007

掀开电脑维修的黑幕

电脑维修是一个很专业的行业,也正因为专业和普通人难以了解,因此存在着一些惊人的内幕和令人难以想象的行业灰色甚至是黑 色操作,当然,绝大多数维修业者都是勤恳专业遵纪守法的,但有极少数维修企业或者个人、作坊,他们的行为是我们不了解内情的局外人初看起来无法理解的。   计算机的主板和显卡,作为电子电路行业中的高精尖领域,其制造和维修的技能、设备和方法 专业性都很强,普通人不要说掌握,就算眼睁睁看到了,也未必能了解维修人员在干什么。大家可以拿电视、影碟机或者是音响内的电路板,去和电脑主板、显卡比 较一下,就会发现电脑的板卡要精密得多。  电脑板卡通常是4层板、6层板甚至是8层板,上 面的布线密密麻麻,大量体积极小的贴片元件和高集成度芯片占绝对主导地位,只有各个重要核心部件比如CPU、GPU的供电模块才会用到直立元件。一块典型 的主板在其30厘米*20厘米的表面上会有1000多个各种零件,而其中某些零件(比如集成显示核心的北桥芯片)一个零件就集成了几千万个晶体管!这些在 主板和显卡上面司空见惯的景象,在其他产品,比如家电产品和工业用嵌入式设备的电路板上是难以看到的。  我 上大学的时候还做过充电器,电路板都是自己画自己泡的,我记得上面还有个分立元件的桥式电路,跟现在的电脑板卡比起来真是笑掉大牙了。哈哈。这么说吧,电 脑的庞大规模和飞速发展造成了电脑板卡的高度专业化和复杂化,而这一点又造成了电脑零部件制造和维修的专业性和复杂性,从而在产业化的大潮中,为各种灰色 现象提供了温床。  [常见三种维修企业形式]
电脑维修企业一般分为三种类型

[厂商售后服务部门]第 一种是厂家或全国代理商自己开办的维修售后服务部,专门为自己的产品提供维修,不是自己的产品不接或者很少接,这通常都是大厂和很大的全国代理开设的。特 点是维修人员比较精通本职,但通常不是学识渊博的全能人才,维修点产品资料、备件都很齐备,保修期内产品占了工作量的大部分,因为维修人员大部分以工资为 主,所以黑暗现象少。这类维修点的问题一是一般都在很偏远的工业区,当然可以通过购买的经销 渠道去返修,但时间会比较长;二是超过保修期和不在保修范围内比如烧损、硬损的产品维修费比较贵。这是因为,有很多厂家对外的维修中心并不真正维修,只能 叫备件更换中心,主要的任务就是把有问题的配件换下来返回到真正板卡生产厂家去维修,他自身并没有维修设备,也没有芯片级的维修工程师,所以保修还好,只 要花钱修就会很贵,一个爆浆电容也敢收几千给换个主板。
[授权专业维修中心]
第 二种是大型的专门维修企业,这一类通常同时是某个或者某些厂家签约的特约维修中心,这些厂家自己不建对外售后服务部门,委托给专业企业来做,比如IBM笔 记本的维修通道蓝色快车。这类维修企业有很多特点跟第一类相似,比较正规,除了做厂家维修点外,同时也接其他产品,技术比较可靠,产品资料、备件都齐全, 缺点和第一类相同,只要花钱修就比较贵。
我家里的苹果ibook笔记本坏了送到特约维修中心,他们同时还做HP、Compaq等笔记本的维修,维 修人员跟我说我这个需要换主板,如果不在保修期内,换一块主板要将近七千元。我的天!我买这二手ibook还不到七千的一半呢!更奇怪的是维修人员告诉 我,修的话是免费,如果不修就要交85元的检测费,这是因为这类企业在修保修期内的产品虽然不从客户收费,但他们要从签约厂家收钱,如果客户不修,那他们 就没法从厂家收费了。

[个人维修商户]第 三种是散布在中关村内各个地方数量众多良莠不齐精华与糟粕并存的私人维修企业。这类企业通常都是在厂家或者特约维修做的时间长技术高的资深维修工程师,为 了多挣钱,自立门户出来创办的,因此公平的说虽然大型维修店都很专业,但技术最精湛水平最高的维修师傅往往在私人维修点。同时,私人维修点主要靠修水货和 过保、保外产品,它们的运营成本最低,操作方式最灵活(除非是黑心维修店,否则绝对不会为了一个电容换主板),维修价格最便宜,有的时候要比前两类低非常 多,这就是为什么私人维修点大江南北如火如荼这么红火的缘故。但是,因为私人维修点都是为了 挣钱,而且挣的都是专业基础差的最终用户的钱(相对而言,第二类企业主要利润来自签约厂家,而厂家是非常懂行的;至于第一类企业,则几乎没有利润需求), 所以各种不正规和丑恶现象也都会看到。当然,这并不是说前两类企业就没这方面的问题,只是出现机会少。

[变废为“宝”]

在中关村的中海等市场经常能看到卖废CPU、内存、硬盘等配件的柜台或个人,对,就是废件,是完全不能用的。比如一个坏的P4 CPU要卖到100多块钱,一个坏的主流容量的硬盘也要卖100元左右,其他坏显卡坏内存等等也各有其价格。谁会买废件呢?买了又有什么用呢?
可 是如果去这些柜台观察一天,就会发现这些废件,偏偏就有人买,这是为什么?当一个电脑用户的主机坏掉了,故障现象正好是黑屏,电脑根本点不亮,而急于修好 电脑的用户又在不知不觉中,把电脑搬到了一个无良的维修点,那么他就要当心了。很多黑屏故障都是因为接触不良或者是电源线、插座坏掉,更严重一些的是电脑 内的电源坏了(我们知道电源是比较便宜的配件),所有这些情况加起来占了黑屏现象的一大部分,而在这些情况下,电脑内部有价值的零部件都是完全没有问题 的,这样就使得维修点没钱可赚,正规来办只能收取一个手工费;这个时候黑心的维修点就会使出一招黑手(不妨叫做狸猫换太子),把电脑上值钱的好的配件取下 来,换上一些坏掉的,反正搬来的时候就黑屏。
维修人只要告诉用户说,您的电脑烧了,很多东西 都坏掉了,如果全修好要多少多少钱(一个高的吓人的数字)。如果用户修,就把用户电脑上的好零件再都换回去,用户搬回去的其实还是自己的电脑,但为了接触 不良甚至是插座、电源线故障付出了沉重的代价;不修,还给用户的时候表面上还是一台黑屏的电脑,但其实好的零件已经全到了维修点手里,用户搬回去的电脑里 都是废件就这么被坑了。对于笔记本用户,最危险的是液晶屏有可能会被无良维修点换掉,这比CPU内存什么被换更加可怕多了!那么给用户这些坏件哪儿来的 呢?你不能说把人家好件都拿走什么都不给装回去,那就漏了。现在大家知道为什么中海市场的坏件都有人买了吧。
[非常规手段]
“狸猫换太子”还会出现在同样是黑屏的情况下,这时虽然确实有坏掉的配件,但用户不愿意花那么多钱来修,想搬别的地儿再看看,货比三家么对不对?黑心维修点是不可能轻易放过你的,都进来了,想全身而退?哼哼……狸猫换太子法有一个共同特点,就是基本都作用在黑屏的电脑上,这是因为买来的坏件通常都是彻底不能用的,如果不是黑屏就无法互换,这种故障现象的消费者要格外注意。相 比于“狸猫换太子”,少数维修点还有一招更黑的。我们知道维修板卡的收费通常都分成若干档次,不同的维修档次收费不同,修不好当然不能收钱(能修好客户不 修例外,有些大型店要收检测费)。所以用户送去维修的板卡,经过检测以后可以报价的,肯定都是能修好的,而且我要透露个秘密给大家,这时候很多都在检测过 程已经修好了,但是不能跟客户说就是了。这个时候报价给客户,都是在维修人员心有成竹的时候,关键就看用户掏不掏钱了,
如果掏钱当然一切妥当,如 果用户嫌贵不愿意修,维修店难道白白把修好的板卡送出门?这当然是不行的,因此通常维修点都会把板卡重新弄坏,这里面的“弄坏”就有学问了,讲良心的维修 点通常会给对方恢复原状,自己自认倒霉白忙活一阵,黑心的维修业者,或者因为嫌麻烦,比如把弄好的各个焊点再开焊,把换上去的好元件再换下来,或者因为自 己损失了时间和精力,甚至出于报复心理,会把板卡彻底弄坏,谁叫你不让我修!老子是你耍得吗?让你也好受不了。
如 何把一片板卡彻底弄坏而表面上还看不出来,这在行业内有很多种黑手法,我在采写过程中就亲眼看见过一种:把一片主板用力撅成弧形,听到里面的焊点“噼噼啪 啪”开裂声,松手后主板虽然恢复“原状”,但是已经报销了。如果说“狸猫换太子”是损人利己,那么这一招是纯损人,不利己,咱们不妨叫它做“玉石俱焚” (好像有点褒奖的意味了?……小编的文学修养确实不行啊)刚才说到的是因为修好了客户不付钱 而导致产品被弄坏,更可恶的是少数水平差心肠黑的维修点,产品修不好,他们也会把板卡完全毁坏,这种人的混帐逻辑是,我这里修不好的东西,你到别人那儿给 修好了,这能行么?这不是给我难看么?所以进了这种地方的板卡,只要没修好,拿出来就别想再修了。
[维修成本雾里看花]
除 了换件和弄坏,再有一种就是虚报、夸大问题,这恐怕是最常见也最被大家所痛恨的方式了,明明实际上很小的问题,到了黑心维修点手里经过检测,就变成了很大 的问题,需要花大把银子去修;明明很简单就能排除的故障,非得给你从前到后换一个遍,大把银子掏出去才能修好。这也罢了,更差劲的是换上去的零件往往图便 宜质量不过关,维修、焊接技术往往粗糙的要命,虽然当时看着修好了,但实际上板卡质量大大打了折扣,过不了多久电感烧毁、电容爆浆、焊点开焊全出来了,还 得回去再受罪。举个例子,某知名日本品牌笔记本用户,花一万多元买的笔记本坏了,拿到特约维 修点,检测后说是主板损坏,换一块要花四千九(比五千还少一百,呵呵,看来维修人员也学过心理学),机主一听吓坏了,赶紧拿出来换了一家私人维修点,重新 检测了一阵,说是主板通过各种高科技仪器能修好,要600块,机主高兴坏了赶紧签单不一会儿修好了兴高采烈付了钱抱机器走了,其实只是换了一颗主板上的电 池。再比如,笔记本的液晶屏不亮了,用户急坏了马上拿到维修点去修,维修点热情接待手脚麻利 迅速检测完毕:液晶屏坏,需换屏,费用在4000元左右。用户这叫一个难受,换吧,4000多块大洋,不换?上万的笔记本就歇了。左思右想只好万般不情愿 的拿出一大笔银子,换了屏走了。其实笔记本屏的问题是多种多样的,比如背光灯管坏了,就会造成不亮,虽然液晶屏幕本身没问题,而灯管是可以换的;再比如笔 记本液晶屏的信号线和电源线(简称屏线)都是通过合页从底座进入上盖,合页本身比较脆弱,而且经常开合,遇到外力磕碰或者挤压就容易造成屏线断裂,从而使 得液晶屏黑屏。
[谨防维修黑手]
虚 报夸大到了极致,就变成“有故障要修,没故障创造故障也要修”。放在黑心维修点检测的电脑,往往是小问题被检测成大问题,没问题被检测成有问题,总之不赚 一笔是不会放你走的。这种手法可叫做“无中生有”。这类欺骗消费者的方法其中有一种需要特别加以注意,送修的机器往往被检测出硬盘有坏道数据全部或者大部 分丢失,需要做数据恢复,收费少则数百元多则数千元。用户觉得太贵,换到别家试试,发现别家确实也检测出来同样的故障,但却无法修复。用户大惑不解之下, 心有不甘的拿回到黑心维修点付了高额恢复费,数据果然全部恢复了!这是怎么回事?说穿了一钱不值,黑心维修点先把数据拷贝出来,然后用某种方法把硬盘轰出 一些坏道或者逻辑错误,然后,就可以正大光明骗钱了!这一招的猥亵之处还在于,除了他没人能解决这个问题。见 识了一些常见的骗钱手段,我们现在再来看看如何防止这种情况的发生。原则就是,你对产品了解越深刻,被骗的可能性就越小,反之就越大,菜鸟是最容易被骗 的。产品送修前,一定要排除软件方面的故障,比如中了病毒或者木马,造成系统死机、不稳定,主板或者显卡bios刷新失败会使得电脑黑屏,此时可通过热插 拔法或者盲操作法将问题恢复,相关操作方法网站上和各类电脑杂志多有介绍,这些都是DIYer自己动手能够解决的故障,实在解决不了要到维修点换 bios,说得清清楚楚也能避免被忽悠。除了软件问题,还要考察是否因为环境问题造成电脑故障,比如电源插线板、电源线接触不良造成的频繁重起动;电网电 压不稳造成电脑死机(电压过低会造成死机,电脑过高和电涌会造成部件损坏)、操作环境灰尘太多造成的电脑不稳定,通常可通过清洁内部消除短路和断路来解 决。总之,一切能用上的手段都应该用上,按照统计,这样能解决电脑故障中的大部分,只有少部分是用户确实无法解决,需要专业维修的。电 脑故障确实属于送修范围,就应该精心挑选维修点。这时的原则是,对于保修期内产品,一定要送到厂商维修点或者特约维修点;对于保修期外产品和无保修的产品 (一些水货),不要选择厂商维修点或特约维修点(除非你很有钱),而应该挑选一家信誉好、技术高的商业维修点。如果不知道维修点的情况,但还是必须送修的 话,那么送修的时候,最好把自己产品主要部件(cpu、主板、内存、硬盘等)的详细规格和编号列表记录清楚同 时给维修点看,或者让对方收机的时候签字确认,如果可能的话,应该把硬盘事先取下来,把故障现象详细写明,并写明排除故障的各种努力,同时把已经排出的问 题也都附上,让维修点知道你对情况很清楚了解,如果能有很懂行的人陪同去维修点就更好。尽量找透明开放操作的维修点,有可能的话最好做立即检测而不是存放 后几天内通知,检测阶段最好全程仔细参观,各个关键步骤不懂的话随时发问,不要怕招人烦,毕竟不被骗要紧。总之,只要细心大胆,不盲从不迷信,遇到问题多 问多想,一定可以把被骗的机会减少到最低的。

Read: 828

走出Windows XP系统最小化克隆误区

在病毒猖獗的互联网时代,小小的Ghost给大家帮了不少忙!–3分钟克隆,3分钟恢复,瞬间系统还原如初!  然而,人们总是在追求更简便的应用,于是,网络内外到处都有关于Ghost最小化克隆的经验技巧。可令人遗憾的是,对目前Windows XP的最小化克隆,误导性的操作比比皆是,以讹传讹!  误导之一:删除C盘根目录下的页面文件Hiberfil.sys   一种做法是教读者一步步打开“控制面板→电源选项→休眠”,取消勾选“启用电源”;另一种做法则更卖力——在DOS 6.22里找到Deltree.exe命令文件,复制到系统盘根目录,然后再通过各种方式将电脑启动到纯DOS,执行Deltree Hiberfil.sys命令以将其删除–因为在Windows下删不掉Hiberfil.sys!  误导之二:移动虚拟内存或删除Pagefile.sys文件  也有两种误导方式:一是移动虚拟内存到其他分区;二是同上面一样,启动到纯DOS通过Deltree来删除。   其实,以上两个文件尽管很大(默认情况下,Hiberfil.sys一般为255MB,Pagefile.sys一般为384MB),但用Ghost软 件进行克隆时,Ghost并没有将它们复制到.gho文件里面去–我曾用Ghost 6.0/7.0/8.0等多个版本反复进行过多次对比克隆,不管是系统盘有没有这两个文件,克隆的最终结果都是433351KB(423MB)左右;同 时,用鬼探测者(GhostEXP.exe)打开.gho文件,也都没有Hiberfil.sys和Pagefile.sys的身影!既然如此,何必多此 一举!  那么,使要克隆的系统盘最小化,可取的措施有哪些呢?  1. 通过Sfc.exe /purgecache清除文件缓存,这是最见效的一招,可将系统减少370MB左右;  2. 通过对系统盘进行搜索,找出所有的.cab、.zip压缩包,移走或删除(能减少85MB左右);  3. 通过Cleanmgr(附件里的磁盘清理工具)以及对 .tmp、$ 临时文件的搜索等方式删除临时文件;  4. 至于帮助文件、字体文件、桌面墙纸文件等,可以移走或删除;  5. 对于系统自作主张为你安装的组件,比如MSN、OE、附件里的游戏等等,可通过“添加/删除程序”将其卸载;  6. 很重要的一个习惯:将所有程序都安装在另一个分区,以减少系统分区的大小;   7. 删除系统盘根目录下的用于系统还原的记载及备份——对于XP系统来说,即便是系统刚装好,也可能在System Volume Information目录中存在几十乃至上百MB的备份文件(单击“工具→文件夹选项→查看”,取消勾选“隐藏受保护的操作系统文件”即可看到)。这一 步一般放在最后也就是克隆之前做,这样才能彻底清空,因为只要你的系统还原功能没有关闭,在其监视之下你所做的一切修改都将在C:System Volume Information里备案!当然,删除了它们,在此之前所做的一切修改也就不能还原了!

Read: 758

CGI扫描器的原理和实现过程

有很多网站为了安全起见,在WEB Server前面架了防火墙,或者做了TCP/IP过滤,对外只开放TCP 80 端口。从入侵者角度来看,要入侵那 么从80上跑的CGI入手是比较可行的,当然也可以用别的办法,例如旁敲侧击,呵呵。从网管角度来看,一是要保证CGI的安全性,另外网络的整体安全性也 是很重要的。针对基于80端口入侵、防范而出的CGI扫描器数不胜数,但基本上原理都一样。
CGI扫描器原理说起来其实非常简单,可以用四句话来概括:<1>连接目标WEB SERVER;<2>发送一个特殊的请求;<3>接收目标服务器返回数据;<4>根据返回数据判断目标服务器是否有此CGI漏洞。
当管理的服务器达到一定数量的时候,手工检测自己的服务器是否存在各种各样的CGI漏洞,那就太消耗时间和精力了,所以一个网管手上有个比较好用的 CGI漏洞扫描器还是必要的。OK!今天我们就自己来动手用C写一个简单的CGI扫描器,帮助自己在日常工作中检测服务器:))

源代码如下,很多地方我都加了注释,别嫌我烦哦:))编译好的程序可以从http://eyas.3322.net/program/cgicheck.exe下载。

/*************************************************************************

说明:这是一个Console下多线程,带有进度显示的CGI扫描器的模板,更改一下szSign和SendBuff就可以扫描其他CGI漏洞,设置了连接、发送、接收超时,速度还可以哦。希望可以帮助到admins检测自己的服务器:))

*************************************************************************/

#include <stdio.h>

#include <winsock2.h>

#include <time.h>

#define iPort 80//目标Web Server端口

#define szSign "500 13rnServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞

#pragma comment(lib,"ws2_32.lib")

///////////////////////////////////////////////////////////////////////////

//

file://定义&初始化全局变量

//

char *SendBuff="GET /NULL.printern",//发送的请求buff

CurrentTarget[52]={0},//存放最后一个线程将扫描的目标

turn[4][2]={"-","\"," ","/"};//显示进度时的字符

int SendBuffLen=strlen(SendBuff),//发送的buff长度

iConnTimeout,//TCP Connect TimeOut

ii=0,//扫描进度

iTotal;//服务器总数

HANDLE hSemaphore=NULL,//信标内核对象句柄,用来控制线程数量

hStdout;//console标准输出句柄,做进度显示的时候用的

struct timeval timeout;//连接、发送和接收的超时值

DWORD SleepTime;//每个一个线程后等待的时间

/*

SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]来计算。确保在 CONNTIMEO时间左右开    ThreadNum个线程。这样在CONNTIMEO时间后,所开的线程开始陆续超时退出,可以继续稳定的开线程, 可以有效的保证同时有    ThreadNum个线程在运行。

*/

///////////////////////////////////////////////////////////////////////////

void ShowError(char *);//显示出错信息函数,可以写完善一些,偶偷懒了:)

BOOL ResetCursor(void);//重置光标位置,线程输出的时候调用的

DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息

DWORD WINAPI scan(LPVOID);//扫描函数

void usage(char *);//帮助函数

///////////////////////////////////////////////////////////////////////////

int main(int argc,char **argv)

{

HANDLE hThread=NULL;//线程句柄

DWORD dwThreadID;//线程ID

struct sockaddr_in sa;

int i,

MaxThread;//最大线程数量

WSADATA    wsd;

long PreviousCount;

clock_t start,end;//程序运行的起始和结束时间

double duration;

file://检查用户输入参数

if(argc!=5)

{

usage(argv[0]);

return 1;

}

file://get target range

int StartNet=inet_addr(argv[1]);

int StopNet=inet_addr(argv[2]);

int StartHost=ntohl(StartNet);

int StopHost=ntohl(StopNet);

file://取得线程数量

MaxThread=atoi(argv[3]);

file://取得conn超时时间

iConnTimeout=atoi(argv[4]);

file://检查参数合法性

if((iConnTimeout>6) (iConnTimeout<2) (MaxThread<1) (MaxThread>500) (StopHost<StartHost))

{

usage(argv[0]);

return 1;

}

file://计算时间

SleepTime=1000*iConnTimeout/MaxThread;

file://设置连接超时值

timeout.tv_sec = iConnTimeout;

timeout.tv_usec =0;

__try

{

file://开始计时

start=clock();

file://加载winsock库

if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)

{

    ShowError("WSAStartup");

    __leave;

}

file://创建信标内核对象句柄

hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);

if(hSemaphore==NULL)

{

    ShowError("CreateSemaphore");

    __leave;

}

file://取得console标准输出句柄

hStdout=GetStdHandle(STD_OUTPUT_HANDLE);

if(hStdout==INVALID_HANDLE_VALUE)

{

    ShowError("GetStdHandle");

    __leave;

}

file://设置目标总数

iTotal=StopHost-StartHost;

file://创建进度显示线程

hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);

if(hThread==NULL)

{

    ShowError("1 CreateThread");

    __leave;

}

file://关闭句柄

CloseHandle(hThread);

file://循环创建扫描线程

for(i=StartHost;i<=StopHost;i++)

{

file://等待信标内核对象通知

    WaitForSingleObject(hSemaphore,INFINITE);

    file://create thread to scan

    hThread=CreateThread(NULL,0,scan,(LPVOID)i,0,&dwThreadID);

    if(hThread==NULL)

{

    ShowError("2 CreateThread");

break;

}

file://进度自加1

    ii++;

file://重设最后一个线程扫描的目标

    sa.sin_addr.s_addr=htonl(i);

    strncpy(CurrentTarget,inet_ntoa(sa.sin_addr),sizeof(CurrentTarget));

file://休息一会儿:))

    Sleep(SleepTime);

file://关闭线程句柄

    CloseHandle(hThread);

}

file://等待所有线程结束

while(1)

{

    WaitForSingleObject(hSemaphore,INFINITE);

    if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount))

{

ShowError("main() ReleaseSemaphore");

Sleep(5000);

break;

}

    if(PreviousCount==(MaxThread-1))

    {

printf("nAll done.");

break;

}

    Sleep(500);

}

}//end of try

file://搞定,清场,收工

__finally

{

file://计时结束

end=clock();

file://转换时间格式

duration = (double)(end – start) / CLOCKS_PER_SEC;

file://显示所用时间

printf("nnComplete.Scan %d targets use %2.1f seconds.Speed %0.3g/sn",iTotal,duration,iTotal/duration);

file://关闭句柄

CloseHandle(hStdout);

CloseHandle(hSemaphore);

WSACleanup();

}

return 0;

}

///////////////////////////////////////////////////////////////////////////

//

file://回显错误信息函数

//

void ShowError(char *msg)

{

MessageBox(NULL,msg,"ERROR",0);

file://printf("n%s failed:%d",GetLastError());

}

//////////////////////////////////////////////////////////////////////////

//

file://重置光标位置函数,以便扫描线程输出结果

//

BOOL ResetCursor()

{

CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

file://取得当前光标位置

if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

{

ShowError("GetConsoleScreenBufferInfo");

return FALSE;

}

file://设置光标X坐标为0

ConsoleScreenBufferInfo.dwCursorPosition.X=0;

file://设置当前光标位置

SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

return TRUE;

}

///////////////////////////////////////////////////////////////////////////

//

file://显示进度信息函数

//

DWORD WINAPI ShowProInfo(LPVOID lp)

{  

int j,k;

CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

float m;

for(j=0;ii<iTotal;j++)

{

file://休息一会儿:)))

Sleep(SleepTime);

file://取得当前光标位置

if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

{

    ShowError("GetConsoleScreenBufferInfo");

    return 1;

}

file://设置百分比进度显示的X坐标

ConsoleScreenBufferInfo.dwCursorPosition.X=0;

file://设置当前光标位置

SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

file://已经完成的百分比

m=(ii+1)*100.00/iTotal;

file://显示进度

if(ii==iTotal)

{

    printf("******** 100%% Wait %d seconds to exit ********       n",iConnTimeout);

    break;

}

else

{

    k=j%4;

    printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m);

}

}//end of for

return 0;

}

///////////////////////////////////////////////////////////////////////////

//

file://扫描函数

//

DWORD WINAPI scan(LPVOID lp)

{

int i=(int)lp,iErr;

struct sockaddr_in server;

SOCKET s=INVALID_SOCKET;

char RecvBuff[1024]={0},*ptr;

int RecvBuffLen=sizeof(RecvBuff);

u_long ul=1;//初始化为为非0值

fd_set r,w;

file://create socket

s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(s==INVALID_SOCKET)

{

printf("nCreate socket failed:%d",GetLastError());

ExitProcess(1);

}

file://fill the addr struct

server.sin_family=AF_INET;

server.sin_port=htons(iPort);

server.sin_addr.S_un.S_addr=htonl(i);

__try

{

file://设置socket为非锁定模式,ul为0值的话,那么soocket将被设置为锁定模式

iErr=ioctlsocket(s,FIONBIO,(unsigned long*)&ul);

if(iErr==SOCKET_ERROR )

{

    ResetCursor();

    ShowError("ioctlsocket");

    ExitProcess(1);

}

file://printf("n%X ioctl ok.strat conn",i);

file://connect to target

connect(s,(struct sockaddr *)&server,sizeof(server));

file://printf("n%X conn return,start select w",i);

file://设置select参数

FD_ZERO(&w);

FD_SET(s, &w);

file://等待connect成功&socket可写

iErr=select(0, 0, &w, 0, &timeout);

file://printf("n%X select w return %d",i,iErr);

file://等待返回后,socket仍不可写则退出

if((iErr==SOCKET_ERROR) (iErr==0))

{

    file://printf("n%X select return w err,exit",i);

    __leave;

}

file://socket可写则继续

else

{

    file://send buff to target

    file://printf("n%X send",i);

    iErr=send(s,SendBuff,SendBuffLen,0);

    file://printf("n%X send return",i);

    if(iErr==SOCKET_ERROR)

__leave;

}

file://等待socket可读

FD_ZERO(&r);

FD_SET(s, &r);

file://printf("n%X start select r",i);

iErr=select(0, &r, 0, 0, &timeout);

file://printf("n%X select r return %d",i,iErr);

if((iErr==SOCKET_ERROR) (iErr==0))

{

    file://printf("n%X select r err,exit",i);

    __leave;

}

else

{

    file://recv buff from target

    file://printf("n%X start recv",i);

    iErr=recv(s,RecvBuff,RecvBuffLen,0);

    file://printf("n%X recv ret",i);

    if(iErr==SOCKET_ERROR)

__leave;

}

file://verify buff

ptr=strstr(RecvBuff,szSign);

if(ptr!=NULL)

{

file://线程输出前要先调用ResetCursor函数

    ResetCursor();

file://输出信息后务必加一个以上换行符号,输出前请别加换行符号,以免显示混乱

    printf("[%-15s] has .printer mapped.        n",inet_ntoa(server.sin_addr));

}

}

__finally

{

if(!ReleaseSemaphore(hSemaphore,1,NULL))

    ShowError("thread ReleaseSemaphore failed");

closesocket(s);

}

return 0;

}

///////////////////////////////////////////////////////////////////////////

void usage(char *proname)

{

printf("n%s v0.1 only can find IIS5 .Printer mapped"

"nPower by ey4s<[email protected]> 2001.5.20"

"nhttp://www.patching.net"

"nnUsage:%s <StartIP> <EndIP> <ThreadNum> <CONNTIMEO>"

"nnNotice"

"n    StartIP StopIP ==>Don‘t forgot StopIP must large than StartIP "

"n    ThreadNum ==>Thread number,please input between 1-500"

"n    CONNTIMEO ==>TCP connect timeout,please input between 2-6"

"nnExample"

"n    %s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname);

}

程序在VC++6.0上编译通过,在windows2000上运行良好:)

Read: 889

Windows操作系统万能Ghost全攻略

相 信很多朋友都有经常被朋友拉去修机器的经历,重装系统就成了噩梦,于是,万能GHOST诞生了,但是网上很多万能GHOST都没有电源管理的解决办法,也 就是说做出来的系统不能软关机。而且网络上发布的万能GHOST大多只是一个空系统罢了,装软件同样费时间啊…………

OK!那我们就来做一个适合自己使用的超级GHOST!

声明:全部使用D版制作

一、准备工作

1、操作系统选择:一般我们选择XP—VLK版作为母版,不需要激活的,更不要破解的。当然这篇文章对2003同样适用。

2、软件准备:找齐你准备在你的超级系统里集成的所有软件(软件必须经过认真测试)、系统修补包(例如SP等)这些东西一定要测试一下。
注意:*在考虑软件的时候要想全一点,各方面要考虑到。
*软件版本必须要新的,这样可以有效延长你的超级镜象的寿命
*要记得集成一个能够有效杀毒并且能升级的杀毒软件(我集成的
是瑞星2005)
*尽量选择公认的、知名的软件,同一用途的软件不要装多了。比如看
图软件选择ACDSEE6.0或者7.0就可以了。其功能已经足够了,不需要
再集成其他类似软件了。

3、制作万能GHOST的机器选择
推荐使用INTEL芯片组的机器,我个人觉得INTEL芯片组的机器做出来的最稳定,VIA的就要差一 些,机器不能太老,但也不要使用太新的。I845这样的就比较合适了。尽量使用一线大厂的主板。不要使用在机器上安装过多的其他设备,只需要基本的就可以 了。另外,内存要大点,512吧

4、OEM信息准备:编写你自己的OEMINI文件、OEM图片

5、集成常用驱动:去www.mydrivers.com收 集大部分常用设备驱动(要那种带INF文件的,分类放好,装在一个文件夹里,文件夹名可以取成“PNP_drv”这样的。) 这样做的目的是为了以后在不同的机器上装系统时在没有驱动光盘的情况下让驱动的安装更方便。当然你也可以不做这个(偶就集成了100多兆的驱动)

6、 找到关于解决系统电源管理方案的电源管理解决方案压缩包,这里偶给大家推荐一高人制作的小东西,很完美的解决了万能GHOST支持不同主板不同电源管理模 式的问题。(不过偶没有上传空间,我也不记得下载地址了,需要的朋友可在上班时间联系QQ:3191775 注明:BBS水友)偶会给你提供这一工具

二、具体实施: ~~~OK!想清楚了?GO!动手的乐趣开始鸟~~~

1、找一块C盘足够大(根据你的具体需要,一般5G)的硬盘,然后安装XP,安装过程就不要我说了吧,注意:安装过程要仔细,力求不出一点点错,安 装完成后,尽量使用系统自带驱动,没必要非要装驱动,反正一会都要删掉所有驱动的嘛……(为了让系统适合更多的人,我一般选择磁盘格式为FAT32而不是 NTFS,你可以根据需要选择)

2、安装所需要的补丁,例如SP2等等。
在安装的时候(例如OFFICE2003这样的大家伙还会问你是不是保留安装源文件,应选择否,要不你的系统会过于庞大)。

3、安装软件并将OEM信息文件拷入SYSTEM32目录中,需要注册的软件用注册机先注册,再次提醒:做的时候不要急,慢慢来,做的越仔细你的GHOST越优秀。(注意软件全部安装在C盘,表装在其他分区中哟!)

4、当以上步骤完成后,重启计算机,然后打开事件查看器,看看系统和应用程序里有没有异常的错误。并测试所有软件。
——————————————————————-

5、设置你的系统:*关闭系统还原 *禁止页面交换文件
*禁用休眠支持 *重启动并检查这些项目设置已生效
*清空临时文件夹、缓存文夹,删掉不需要的桌布图片。
这些是为了减少无谓的磁盘空间消耗

6、在C盘建立一个名为sysprep的文件夹,注意:必须是SYSPREP

7、将XP安装光盘上SUPPORTTOOLSDEPLOY.CAB压缩包中的所有文件解压缩到你建立的SYSPREP文件夹中。

8、COPY 你收集的常用驱动程序存放文件夹到C盘根目录。

9、将电源管理解决方案压缩包解压缩到你建立的SYSPREP中。解出来应该包括一个叫ACPI的文件夹和一个ACPI.exe和一个acpi.reg,请不要更改文件夹的正确结构。

10、运行SYSPREP文件夹中从SUPPORTTOOLSDEPLOY.CAB压缩包中解压缩出来的一个名为setupmgr.exe的 程序,创建一个自动答应文件(完全自动),以自动提供系统重装时所需要的必要信息。注意:创建出来的自动答应文件名一般为:sysprep.inf 必须存放在C盘中的SYSPREP文件夹中。

10、修改计算机类型为Standard PC,修改完后系统会要求重启,一定不要重启!(必须这样做!)

11、修改IDE ATA/ATAPI控制器中第一个"xxx Controller"为"标准双通道控制器。修改完后系统会要求重启,一定不要重启!(必须这样做!)

12、执行从电源管理解决方案压缩包中解出的一个名为“devcon.exe”的程序(命令为devcon remove * ),以快速删除所有系统中的硬件设备驱动。
使用方法:开始–运行–CMD–在命令行模式下运行(注意命令的路径要正确哦,)

13、运行从电源管理解决方案压缩包中解出的一个名为acpi.reg的注册表文件,将其中信息导入注册表。(目的是为了在第一次启动的时候能够运行电源管理选择程序)以解决电源管理问题。

14、等等,我点支香烟,他母亲的,我的打火机那去了!?

15、运行SYSPREP文件夹中从SUPPORTTOOLSDEPLOY.CAB压缩包中解压缩出来的一个名为sysprep.exe的程 序,勾选NOSIDGEN、MINISETUP、已提前激三项(PNP项没必要勾选,会浪费时间的),关机一项最好选择成:SHOUTDOWN
最后,点击重新封装。这时系统将会被重新封装。完成后系统会自动关机(如果在关机一项设置的是“SHUTDOWN”的话)。

16、重新启动系统,用光盘引导系统进DOS,启动GHOST(推荐使用8.0及以上版本)。将C盘打成GHOST镜像。

说明:*由于集成了大量软件所以镜像可能会达到1.5GB左右,因此使用GHOST的时候应使用参数Z9获得最大压缩比的镜像文件。
* 如果需要刻录成光盘的话则需要使用GHOST的分卷刻隆参数,将镜像分卷文件限制为650兆。这样制作出来的镜像文件一般就会有三个。这样一般的镜像不会 超过三张盘(不推荐使用700兆的限制,因为有些光驱读起来可能有些困难)。制作光盘的时候头一张应该应该包含以下功能以方便使用:引导+ GHOST.EXE+分卷刻隆的第一部分,后两张光盘应分别刻录后两个分卷。
注意:在使用这三张光盘的时候是有顺序的哟,原因自然不需多讲了。

17、最后随便找个机器测试你的镜像。

18、大功告成!来`来~啵一个~

19、谁能告诉偶偶的打火机在那~~~5555

——————————————————————-

关于镜像的使用:

1、将此镜像恢复到目标计算机。
(应该注意目标计算机的配置,如果是C300A+64MB……那么……一般内存应该至少在128以上,256及以上是比较合适的,毕竟年代不同了嘛)。

2、恢复完镜像后重启。

3、重启后计算机会出现一个安装画面,不要急,这个过程不会有安装的时候那么长的,不过这里会出现个新DD,那就是在这个检测过程中会弹出一个窗 口,让你选择电源管理模式,嘿嘿,我们正是需要的这个!上面有很好的提示,自己看吧。提示:这个窗口中有个默认选项ACPI PC,这项适合绝大多数主板的。
注意:*一定要看清楚是支持单处理器还是多处理器的。一般的机器都是单处理器哟。
*如果你选择错误……那么你的机器将不能启动,必须要重新恢复镜像并且重新选择。
*Standard PC适用于任何PC,但是非常可耻的是这种类型不能软关机

4、然后的事情就不需要你管了,自动答应文件会提供所有信息。最后系统会重启。

5、重启后你会看见你熟悉的XP,进入系统后不要操作计算机(耐心等待会),系统会开始重新安装所有的硬件驱动,原因太简单啦~因为你删了所有的硬 件驱动嘛………如果此期间系统发现某个设备没有驱动(例如很新的显卡、声卡等),问你要,不要理它,按ESC跳过,让它先把它认识的先装完。
完成后系统会要求重启动。OK,批准~

6、再次重启后,安装其他系统无法直接识别的设备驱动。再次关闭系统还原这个垃圾功能。(页面交换文件系统会自动启用,无需手动设置)。这时候一个 带有大部分常用软件的配置精良的系统就已经搞定了。目前的主流机器整个过程仅需不到30分钟。尤其适合我这样经常被拉去帮别人重装系统的人

——————————————————————-

使用方案:

1、由于镜像文件很大,所以偶推荐使用硬盘来装,随便找个硬盘,两个分区,C区一点点大就行,格成启动到DOS的系统区,D盘装GHOST.EXE 和这个硕大无比的镜像外加一些常用的工具。这样需要恢复的时候直接将你的硬盘挂上目标计算机,用你的硬盘引导,启动GHOST,然后开GHO,然 后…………
大家都知道,硬盘速度自然比光盘快的多啦~~~

2、光盘方案,没什么好多的,分卷制作镜像文件,分别刻录到三张光盘上,其中第一张要带引导,要有GHOST.EXE。优点是使用方便,不过缺点也很比较明显–速度自然没有硬盘快咯。

Read: 769

用VC++编写CGI程序

近年来,Internet与Intranet迅猛发展,企业纷纷建立自己的Intranet,以加强企业内部的联系,促进与外部世界的沟通,增强企业的竞 争能力。通过建立自己的Internet服务器,企业能在网络上发布广告,介绍本公司的情况与产品,收集顾客意见,以及建立虚拟电子商场等。大家都知道写 一个HTML超文本文件放在World Wide Web服务器上,即可通过各种浏览器访问你的主页,但是如何使你的静态主页能响应客户的动作,并与本地的数据库联系,将数据库的相应内容传送给远端的浏览 器呢?这就需要通过CGI接口进行联系。
CGI全名是Common Gateway Interface,它是WWW服务器调用外部程序的接口通过CGI,WW W服务器能完成一些本身所力不能及的工作。

在不同操作系统下CGI接口也不相同,可分为Standard CGI接口、DOS CGI接口与Win CG I接口等。Standard CGI接口用于Unix系统,它是通过环境变量来实现WWW Server与CGI应用程序之间的联系。DOS CGI接口与Standard CGI接口原理类同。Win CGI接口则与前两者大不相同。由于越来越多的WWW Server采用Windows系统,而Windows系统又不能有效地传递环境变量,由Bob Denny提出了一种Windows CGI标准,并得以不断推广。
Win CGI是通过.ini文件来进行联系的。在Windows环境下,许多应用程序都是利用.ini 文件,即profile文件来定义一些基本设定,而Win CGI程序与WWW Server之间也正是通过pro file文件来实现联系的。当WWW Client通过WWW Server触发CGI程序时,WWW Server先动态生成几个文件于临时目录下,分为.ini、.inp、.out等文件。在WWW Server生成CGI程序的进程时,通过命令行参数将.ini文件的绝对路径传给CGI进程。.ini文件中也包含了.inp、.ou t等文件路径信息。这样,CGI程序可读取.ini和.inp文件所提供的信息,了解所有来自WWW Server端和与WWW Client端的数据。然后,CGI程序可以调用外部程序,或由CGI直接执行外部程序的功能,并将要传给客户端的信息以HTML文本的形式写在.out 文件上。最后,WWW Server取.out文件的HTML文本,将信息传送给WWW Client端,并删除临时目录下的文件。那么,CGI的profile文件包含了什么数据呢?与Windows其它.ini文件一样,CGI profile 文件包含了许多session,每个session又包含一些key,以下是一个CGI profile的部份内容

[CGI]
Request Method=POST //传递方式,即HTML中的Form method有GET,POST,HEAD等。
Server Software=WebSite/1.1e
//Server的名称与版本。
Server Name=199.199.198.55
//Server的IP地址。
Server Port=80//Server的Socket Port。
Server [email protected]//Server管理者的E-mail地址。
Referer=http://199.199.198.55/
//主页的URL路径。
Remote Address=199.199.198.89
//Client端的IP地址。
[System]
Output File=c:WebSitecgi-temp198ws.out//输出文件的路径名。
Content File=c:WebSitecgi-temp198ws.inp//输入文件的路径名。
[Form Literal]
type=B//接收到的Form data即client端动作的结果信息。

原则上可用来编写CGI程序的语言有:perl, AppleScript, Unix Shell, VB, C/C++等。但在Windows(NT、3x、95)环境下,还是必须借助成熟的Windows编程语言才能编写出精巧的Win CGI程序。C语言是一门深受广大程序员喜爱的语言,尤其是VCi++作为一门面向对象的语言,具备了Windows环境的许多基本功能,如OLE, ODBC等。通过ODBC这项功能,可以非常容易地连接FoxPro, Access, dBASE等多种数据库,而无需考虑各种数据库结构的差异。
以下是笔者用VC++4.0编写的一个用Win CGI连接数据库的范例。使用者可在屏幕上选择,以查询ISP服务商提供的internet服务价格表。系统环境采用Windows 95,数据库采用FoxP ro2.5, WWW Server采用Website。

1.建立数据库
本例的CGI程序是通过ODBC连接数据库,因此数据库建完后,应用32位ODBC驱动器加以登记。

2.编写HTML程序
使用者可在屏幕上选择一服务类型,再按"提交"键,即可查询这一服务类型的各价格栏目。其HTML文本描述如下:
<HTML>
<HEAD>{TITLE>维科公司internet服务收费标准</TITLE></HEAD>
<pre><H1>维科公司internet服务收费标准</H1>
</P>
<hr><form method="POST" action="cgi-win/wincgi.exe">
您要查询的类型是:
<UL><LI>A类用户<input name="usertype" type=radio value="A">
<LI>B类用户<input name="usertype" type=radio value="B">
<LI>C类用户<input name="usertype" type=radio value="C">
<LI>D类用户<input name="usertype" type=radio value="D">
</UL>
<center>
<input type=submit value="提交"> <input type=reset value="取消"></center>
</pre></form><hr>
</HTML>

3.编写VC++CGI程序

Website为C++程序员提供了一个CCGI类,可在website目录下找到。该类提供了一些方便的函数,无需程序员编写一些直接与CGI界面打 交道的底层工作,充分体现面向对象语言的优势。在VC++4.0中建立一个"Dialog based"工程框架。将CCGI类引入框架,即将cgi.h,cgi .cpp加入程序。然后用VC++的ClassWizard工具创建一个与数据库相对应的CUserSet类,该类继承MFC类库中的 CRecordSet类。
主要代码加在wincgi.cpp文件中。

//程序:wincgi.cpp
#include "stdafx.h"
#include "wincgi.h"
#include "cgi.h"
#include "userset.h"
……
void ProcessCGI(CCGI *cgi);
BOOL CBaseApp::InitInstance()
{
CCGI cgi(m-ipCmdLine); //实例化CCGI类,并用命令行参数初始化
if(cgi.CalledAsCGI())
{
try
{
ProcessCGI(&cgi);
//在此做所有真正的工作
}
catch(CException* e)
{
cgi.HandleException(e);
//异常处理
e->Delete();
}
}
return FALSE;
}
void ProcessCGI(CCGI *cgi)
{
int i;
CString strTemp, strWebmaster, strReferer;
strWebmaster=cgi->GetCGIVar("Server Admin");
//获得Server管理者的E-mail地址。
strReferer=cgi->GetCGIVar("Referer"); //获得主页的URL路径。
CStringArray csaFields;
cgi->EnumFormFieldNames(csaFields);
//取得所有变量名,放在数组中。
cgi->WriteHTMLHeader();
cgi->WriteHTMLBody("<HEAD><TITLE>VC++CGI test</TITLE></HEAD>1512");
cgi->WriteHTMLBody("<BODY>1512");
CString csaFieldVal;
csaFieldVal=cgi->GetFormField(csaFields[0]);
//得到第一个变量的值,即"usertype"变量的值。
cgi->WriteHTMLBody("<h1>internet服务收费标准查询结果</h1><hr>");
CUserSet m-user;
//实例化CUserSet类
char sfilter[80];
wsprintf(sfilter,"USER-TYPE=´%s´´´,csaFieldVal);
m-user.m-strFilter=sfilter;
//设置筛选器。
m-user.Open();
strTemp="<h2>"+m-user.m-USER-TYPE+"类用户"+"</h2>1512";
cgi->WriteHTMLBody(strTemp);
strTemp="<P>入网费:"+m-user-FARE-INI+".</P>1512";
cgi->WriteHTMLBody(strTemp);
……
strTemp="<P>通信费:"+m-user.m-FARE-COM+".</P>1512"
;
cgi->WriteHTMLBody(strTemp);
m-user.Close();
if(!strReferer.IsEmpty())
//设置回到主页的锚点。
{
cgi->WriteHTMLBody("<P>Go<A HREF="");
cgi->WriteHTMLBody(strReferer);
cgi->WriteHTMLBody("">Back</A>where you came from.</P>1512");
}
if(!strWebmaster.IsEmpty())
//设置Server管理者的E-mail地址。
{
cgi->WriteHTMLBody("<P>Please email comments to");
cgi->WriteHTMLBody("<A HREF="mailto:");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("">");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("</A>.</P>1512");
}
cgi->WriteHTMLBody("</BODY>1512");
cgi->WriteHTMLFooter();
}

4.结论
将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用浏览器查询结果。至此简单地阐述了用VC++编写Win CGI程序的整个过程,C程序员也可以用自己熟悉的语言编写CGI程序了。利用VC++的强大功能,你的WWW Server将无所不能。

Read: 904