电信做假,比较搞笑!!!

每当看到网络上、电视上、报纸上提到的所谓中国移动的“飞速发展”都觉得哭笑不得。这里边究竟有多少是真实的?大多数都是自欺欺人吧。整天喊着“正德厚生、臻于至善”的移动人,每天都在做着什么呢?成倍增长的KPI指标、每天接连不断的OA、电话、短信;和无休无止地做假。  我只是地市公司的一个普通员工。参加工作也有几年了。我看到的是:每推出一项新业务必定列入KPI考核,而且考核数量每月几倍的增长。不做假根本完不成。我就是想揭穿这些猫腻。来88这些做假方法:

1、 公司出钱给客户订的业务  比如手机报、比如财信通、比如移动气象站、比如彩铃下载……给客户的解释口径是赠送。但是很多客户还是投诉,因为讨厌啊。每天好多垃圾短信谁不烦。指标下的每月几千条的业务,一条一条订完再准备迎接投诉。  2、 公司不出钱又必须完成的指标  强行定。客户发现了就说办错业务,双倍返还呗。又是苦了我们。累啊  3、 订了业务还需要活跃的指标  这个特别讨厌。比如飞信,比如手机邮箱,比如企信通。不但定了还要客户用。不用就不算完成指标。于是我们就自己活跃。  飞信、手机邮箱设置成统一密码,好几千号码挨个登陆。手机证券、好几千号码定完了挨个浏览行情。企信通、以前给客户发。今年3.15之后不敢给客户发了就给自己员工发。就在我写东西的同时我手机不断接短信。满格的电只接短信都快接光了。    最近最恶心的是12580和做呼叫转移。先说12580,业务倒还算实用。查车次啊宾馆啊饭店啊都行。但是刚开始推出业务就给我们下了一个月上万的指标。怎么办?自己员工打吧。每人每月打400遍12580。问车次、票价、订宾馆啥都行。卡就40张,一个号得打10次。问得12580都烦了。也知道是自己人打的。感觉像过家家呢。自己人哄自己人玩。据说有的难友实在没话说了,最后说了句:“我也不知道问啥了,你猜猜我媳妇生的是男孩还是女孩吧。”

做呼叫转移是为了消灭零次客户。每个月都有客户一个电话不打,一个短信不发。人家就接电话,还接听免费。公司就考核我们,要消灭一大部分零次客户。怎么办?做呼叫转移。然后我们自己打电话,客户产生呼叫转移费用就OK。才几毛钱,很多人还是不会留意。但是也有出事的。我们是一个做呼转,一个打电话,一个接电话,一个取消呼转。长期做配合的很是默契。有一天打电话的去了趟洗手间,做呼转的做出去好几十,人家打电话了。我们接电话的一接人家说不对啊。我打XXX你是谁啊。我们只好硬着头皮说我也不知道啊,我还想知道你是谁呢。偏又找不到是哪个号码。后来只能紧急全部取消了。这样做有些时候后果可能会很严重.曾经有客户说老婆打他电话他接了不说话.偏这人又有前科,老婆怀疑他有女人跟他离婚了.后来一查是被呼转了.索赔了一大笔.他说的真假不清楚,但这种事确实是可能发生的.说到这又想起来垃圾短信的事了.为了完成短信计费量我们就天天给客户发.发多了难免有情啊爱啊荤的啊.据说有家男人把老婆打住院了.

我们员工真不想这样骗人骗自己。我们还累,还要挨客户骂。不知道是哪个BT发明的KPI考核,我想可能哪家公司发明个新业务,跟集团公司领导一喝,领导乐了:“哦了,你家的业务包在我身上。我给你列入KPI。”  万恶的KPI啊。集团公司要发展、省公司要在各省中业绩拔尖、市公司要在省公司考核中脱颖而出、部门又想争全市第一。领导要业绩要升职。层层加量层层施压。打个比方:集团公司下给省里10000指标,省里下给市里50000,市里下给各中心100000。中心再下到各人……  员工真是苦不堪言。尤其是C类.晚上能正常下班都是奢侈,白天正常接待客户,晚上经常做假指标做到10点以后。除法定节假日加班不给加班费。  即使做这么多的任务、指标也不见得领导就DJ你。绩效、竞聘等重重考核。领导发给我们的书全是《没有任何借口》等一些奴化教育的书。出了错没有理由就是错了。  上边说的这些只是冰山一角。看了公司发的什么丰富员工业余生活,这个演讲那个竞赛,满意100活力100之类的口号。觉得好假。口号喊得一个比一个响,该欺骗欺骗,该折磨折磨。现在我都得了电话恐惧症。无论是短信、电话铃音一响我心就一阵颤抖。有些人可能说:你可以关机啊,可以调无声啊。我们领导的要求是24小时开机。短信通知办公邮件,哪个不听都不行。好多员工得了偏头痛。电话辐射的呗。  奉劝各位大学生一句:想进移动千万别进市场口。市场口只有领导能享福。员工低贱如蝼蚁。想当领导……上头没人的或者不会溜须拍马的就别做梦了。

有个大学生在我们这10086客服实习.实习的结果是这人成了投诉专业户.问的问题又专业又有水准.比如呼叫转移资费.漫游地和非漫游地的不一样.他打电话问10086怎么收费.10086也不太明白,乱解释一通说不收.那大学生说不收好,咱们就慢慢聊.结果聊进去250元.然后投诉,申请4倍返还.最后还了他1000.  还有一次这大学生打12580查北京一家宾馆.名字很古怪.12580问是哪几个字,他说我也不知道就知道读音.12580也闲麻烦就说查不到.后来这大学生投诉到信息产业部.人家有理啊:要是北京奥运来了国际友人,光知道宾馆名字读音不知道哪个字你们难道就不给查了吗.  还有一次他打电话,也是问个挺刁钻的问题.对方说请稍等我去查.他就在那掐时间.20秒后他说:"行了,你们规定是不得让客户等待超过20秒,时间已经过了你不用查了我要投诉你."  后来10086把他列为恶意投诉客户.把他号码屏蔽了.他打电话打不进去,用别人的打都没问题.他就用其他号码投诉.接待她的话务员说了句:"拨打10086是有次数限制的."这大学生说:"就凭你这句话.我就投诉你."直接投诉到信息产业部后来话务员哭着求他他才撤了诉.  后来他的投诉记录被订成厚厚一本,成为每个话务员入行必读教材.

动态链接库 - 编写

文件是否是动态链接库取决于它的文件结构,动态链接库和可执行文件同样使用标准的PE文件格式,公文件头中的属性位不同而以,所以EXE中的一些特征也存在于动态链接库中,比如,可以定义并使用各种资源,可以导入并使用其他动态链接库中的函数等.
要牢记一个概念:动态链接库是被映射到其他应用程序的地址空间中执行的,它和应用程序可以看成是"一体"的,动态链接库可以使用应用程序的资源,它所拥有的资源也可以被应用程序使用,它的任何操作都是代表应用程序进行的,当动态链接库进行打开文件,分配内存和创建窗口等操作后,这些文件,内存和窗口都是为应用程序所拥有的.

例:(罗老板的代码)
Dll.asm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Sample.asm
; Link /subsystem:windows /Dll /Def:Sample.def Sample.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .386
    .model flat, stdcall
    option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .data?

dwCounter  dd  ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的入口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry  proc  _hInstance,_dwReason,_dwReserved

    mov  eax,TRUE
    ret

DllEntry  Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 本函数在 dll 内部使用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CheckCounter  proc

    mov  eax,dwCounter
    cmp  eax,0
    jge  @F
    xor  eax,eax
    @@:
    cmp  eax,10
    jle  @F
    mov  eax,10
    @@:
    mov  dwCounter,eax
    ret

_CheckCounter  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的导出函数之一
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_IncCounter  proc

    inc  dwCounter
    call  _CheckCounter
    ret

_IncCounter  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的导出函数之二
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DecCounter  proc

    dec  dwCounter
    call  _CheckCounter
    ret

_DecCounter  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的导出函数之三
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Mod    proc  uses ecx edx _dwNumber1,_dwNumber2

    xor  edx,edx
    mov  eax,_dwNumber1
    mov  ecx,_dwNumber2
    .if  ecx
      div  ecx
      mov  eax,edx
    .endif
    ret

_Mod    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    End  DllEntry

程序仅定义了5个子程序,其中程序的入口由最后一句End定义到了DllEntry处.
程序入口代码什么都没做,仅返回一个TRUE,也没有用到_IncCounter,_DecCounter,_Mod函数,这是因为DLL文件被设计为不是供自己使用的,而是被映射到其他应用程序的地址空间中代表"宿主"程序执行的,这些函数就是供其他程序使用的函数,这些函数对于宿主来说和User32.dll中的CreateWindowEx等极其复杂的函数没有任何区别

1.入口点和初始化代码

DllEntry    proc  hInstDll,dwReason,dwReserved

    mov  eax,dwReason
    .if  eax == DLL_PROCESS_ATTACH
      ;保存hInstDll
      ;初始化库需要的各种资源

      .if   初始化成功
        mov eax,TRUE
      .else
        mov eax,FALSE
      .endif
    .elseif  eax == DLL_THREAD_ATTACH
      ;为新的线程分配资源
    .elseif  eax == DLL_THREAD_DETACH
      ;为线程释放资源
    .elseif  eax == DLL_PROCESS_DETACH
      ;释放库使用的资源
    .endif
    ret

DllEntry    Endp

动态链接库需要一个入口点,这个入口点是一个函数,函数

名并不重要,例子中函数名为DllEntry,可以把它取名为任何合法的名字,但入口函数的格式是有规定的.库的入口函数对调用动态链接库的应用程序来说是不可见的,它仅供操作系统使用.windows在库加载,卸载,进程中线程的创建和结束等时候调用入口函数,以便动态链接库采取相应的动作.在入口函数中可以通过参数来判别本次调用究竟是在哪种情况下发生的.

Windows会传给入口函数3个参数
dwReason:表示本次调用的原国,可能是四种情况之一
DLL_PROCESS_ATTACH:表示动态链接库刚被映射到进程的地址空间,程序可以在这里进行一些初始化的工作,成功返回TRUE,失败返回FALSE.这给了动态链接库一个机会来阻止自己被装入.比如库可以在这里申请并保留一些内存,如果申请失败的话返回FALSE告诉windows,库无法正常工作.

内存映射文件

使用内存映射文件
1.内存映射文件函数
内存映射文件包括:CreateFileMapping,OpenFileMapping,MapViewOfFile,UnmapViewOfFile和FlushViewOfFile.
创建一个内存映射文件对象使用CreateFileMapping这个步骤内存映射文件的用途(是在磁盘上建立内存映射文件,还是在页文件中建立进程间共享的映射

invoke CreateFileMapping,hFile,lpFileMappingAttributes,flProtect,dwMaximumSizeHigh,dwMaximumSizeLow,lpName
.if eax
mov hFileMap,eax

hFile:指定一个文件句柄.如果句柄是属于一个已经打开的文件的,那么内存映射文件将在这个文件上面建立;如果要建立存在于页文件中的内存映射供不同进程共享,那个hFile指定为-1
lpFileMappingAttributes:指向一个SECURITY_ATTRIBUTES结构,用来定义内存映射文件对象是否可继承
SECURITY_ATTRIBUTES结构,该结构定义如下

SECURITY_ATTRIBUTES STRUCT
nLength DWORD ? ;本结构的长度
lpSectrityDescriptor DWORD ?
bInheritHandle DWORD ? ;是否允许继承
SECURITY_ATTRIBUTES ENDS

将nLength设置为结构的长度,将bInheritHandle设置为TRUE就可以使句柄能够被子进程继承
不继承可把这个参数设置为NULL
flProtect:指定内存映射文件的保护类型,有3个取值
PAGE_READONLY:内存映射文件提交的内存页面是只读的,对应的CreateFile也要设置GENERIC_READ标志
PAGE_READWRITE:内存页面可读写,对应CreateFile设置GENERIC_READ和GENERIC_WRITE
PAGE_WRITECOPY:内存页可以有Copy on Write属性.对应CreateFile设置GENERIC_READ和GENERIC_WRITE
dwMaximumSizeHigh和dwMaximumSizeLow:这两个参数组合指定了一个64位的内存映射文件长度,如果内存映射文件用于磁盘文件的时候,这个长度如大于磁盘文件长度,磁盘文件将扩展到这个长度.如小于磁盘文件长度,那么只能存取磁盘文件的一部分,一种简单的方法是全设置成0,系统当自动调整磁盘文件大小
lpName:用来给定内存映射文件的名字.当内存映射文件作用于磁盘文件的时候,不需要给它起名;如用于进程间共享内存,那就必须为该对象命名,因为在其它进程中只有使用这个名称才能打开这个内存映射文件对象,该名字字符串不能和其他进程已创建的对象同名.

当一个进程创建内存共享文件用于和其他进程共享的时候,其它进程不能再使用CreateFileMapping去创建同样的内存映射文件对象,而是要用OpenFileMapping函数打开创建好的对象

invoke OpenFileMapping,dwDesiredAccess,bInheritHandle,lpName
.if eax
mov hFileMap,eax
.endif

dwDesiredAccess:参数指定保护类型,有3个取值
FILE_MAP_WRITE(或FILE_MAP_ALL_ACCESS):可写属性
FILE_MAP_READ:可读属性
FILE_MAP_COPY:Copy on write属性
lpName:指向的名字就是创建对象时使用的名字
如果CreateFileMapping或OpenFileMapping函数执行成功返回内存映射文件句柄,如果执行失败返回NULL

MapViewOfFile函数用来映射内存映射文件的一个视图,这个函数的用法

invoke MapViewOfFile,hFile,hFileMap,dwDesiredAccess,dwFileOffsetHigh,dwFileOffsetLow,dwNumberOfBytesToMap
.if eax
mov lpMemory,eax
.endif

hFileMap:CreateFileMapping或OpenFileMapping返回的句柄
dwDesiredAccess:指定保护类型
FILE_MAP_WRITE(或FILE_MAP_ALL_ACCESS):可写属性
FILE_MAP_READ:可读属性
FILE_MAP_COPY:Copy on write属性
dwFileOffsetHigh和dwFileOffsetLow:组成64位的偏移量,用来指定视图的基地址是从文件的哪个位置开始映射
dwNumberOfBytesToMap:指定映射的字节数,如果设置为0则映射的是整个文件,同时偏移地址被忽略
如果映射成功,返回一个地址,如果映射失败,则返回NULL

当不再使用映射文件后,通过UnmapViemOfFile函数撤销映射并使用CloseHandle函数关闭内存映射文件对象句柄

invoke UnmapViewOfFile,lpMemory
invoke CloseHandle,hFileMap

视图中的内存修改后,系统会在视图撤销映射或文件映射对象被删除时自动将数据写到磁盘上,但可以根据需要将对文件的修改立即写到磁盘上,该功能的函数FlushViewOfFile

invoke FlushViewOfFile,lpMemory,dwFileSize

该函数将从指定地址开始,指定大小的数据块中的脏页面写到磁盘,指定的内存范围必须位于视图的边界之内

2使用内存映射文件读写文件
内存映射文件读写文件的步骤
(1) 调用CreateFile打开想要映射的文件,得到hFile
(2) 调用CreateFileMapping函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象,得到hFileMap
(3) 调用MapViewOfFile把整个文件的一个区域或整个文件映射到内存中,得到指向映射到内存的第一个字节的指针lpMemory
(4) 用该指针来读写文件
(5) 调用UnmapViewOfFile来解除文件映射,传入参数为lpMemory
(6) 调用CloseHandle来关闭内存映射文件,传入参数为hFileMap
(7) 调用CloseHandle来关闭文件,传入参数为hFile
例程: …………….

3使用内存映射文件在进程间共享数据
进程间共享数据的步骤如下:
(1) 调用OpenFileMapping打开一个命名的内存映射文件对象,得到hFileMap,打开成功跳到(3),否则表示此程式是第一个副本,继续执行步骤(2)
(2) 调用CreateFileMapping函数创建一个命名的内存映射对象,得到hFileMap
(3) 调用MapViewOfFile函数映射对象的一个视图,得到lpMemory
(4) 用该指针来读写共享的内存区域.
(5) 调用UnmapViewOfFile来解锁视图映射,传入参数为lpMemory
(6) 调用CloseHandle来关闭内存映射文件,传入参数为hFileMap
例程: …………….

驱动器和目录 — 目录操作

1.创建和删除目录
创建目录使用CreateDirectory函数,例如:

szDir db 'c:dir1dir2',0

invoke CreateDirectory,addr szDir,NULL

如果创建成功返回TRUE,失败返回FALSE
注意:创建目录的上层目录必须存在,创建目录名不能与同目录下的目录或文件同名

删除目录使用RemoveDirectory函数

szDir db 'c:dir1dir2',0

invoke RemoveDirectory,addr szDir

如删除成功返回TRUE,否则返回FALSE
注意:被删除的是参数中指出的最后一级目录,删除目录必须是一个空目录,删除的文件不会进入回收站

2.一些特殊目录
当前目录:所有未指定路径的文件名均默认使用这个目录
Windows目录:Windows操作系统的安装目录
系统目录:Windows安装目录下存放系统文件的目录(9X下是system,NT下是system32)
临时目录:存放临时文件的目录,系统可以在磁盘空间不足的时候自动删除里面的文件.
Win32中专门设置了几个函数来获取这些目录的位置

invoke GetCurrentDirectory,dwBufferSize,lpBuffer ;获取当前目录
invoke GetTempPath,dwBufferSize,lpBuffer ;获取临时目录
invoke GetWindowsDirectory,lpBuffer,dwBufferSize ;获取Windows目录
invoke GetSystemDirectory,lpBuffer,dwBufferSize ;获取系统目录

lpBuffer:指向一个缓冲区,用来接收返回的路径字符串
dwBufferSize:指出了缓冲区的大小,一般设置为MAX_PATH
注意:四个函数的参数顺序,GetTempPath返回值包括'' 而其它三个没有,当程序运行的时候,默认的当前路径是执行程序所在目录,但不是绝对的,比如使用GetOpenFileName等函数,会设置当前目录为指定的目录

修改当前路径用SetCurrentDirectory

szDir db 'c:dir1dir2',0

invoke SetCurrentDirectory,addr szDir

驱动器和目录 — 逻辑驱动器操作

1.卷标操作
驱动器创建,修改,删除卷标都可以使用SetVolumeLabel函数

szPath db 'c:',0
szVolume db 'System',0
invoke SetVolumeLabel,addr szPath,szVolume

szPath:指出了要设置卷标的逻辑驱动器的根目录
szVolume:指向包含卷标字符串的缓冲区
删除卷标的二种方法

szPath db 'c:',0
szVolume db 0
invoke SetVolumeLabel,addr szPath,szVolume

szPath db 'c:',0
invoke SetVolumeLabel,addr szPath,NULL

如果函数执行成功返回值是TRUE,否则返回FALSE

2.逻辑驱动器的检测
检测系统中当前存在多少个逻辑驱动器可以使用GetLogicalDrives函数,它没有输入参数,它返回一个32位整数,用其中的每一位代表是否存在一个逻辑驱动器.由于系统中可用的盘符公有26个(A~Z),所以用第0到第25位表示A:~Z:

如果认为认为上面的函数做位测试比较麻烦也可以使用GetLogicalDriveStrings,这个函数返回字符串类型的逻辑驱动器列表:

invoke GetLogicalDriverStrings,dwBufferSize,lpBuffer

lpBuffer:指向一个缓冲区,函数在这里返回'A:',0,'B:',0 格式的字符串
dwBufferSize:指出缓存区的大小,如果缓冲区不够大,后面的数据会被截尾

检测驱动器类型的工作可以用GetDriveType函数来完成

szPath db 'c:',0
invoke GetDriveType,addr szPath

szPath指向存放在逻辑驱动器根目录的字符串的缓冲区,函数返回值是驱动器的类型,是下面7个位的一种
0:驱动器类型无法检测
1:指定的根目录不存在
DRIVE_REMOVABLE:可移动介质,如软盘
DRIVE_FIXED:固定盘,如硬盘中的逻辑驱动器
DRIVE_REMOTE:远程驱动器,如网络上映射的驱动器
DRIVE_CDROM:光盘
DRIVE_RAMDISK:内存虚拟盘

如果需要更详细的情况,可以使用GetVolumeInformation函数

invoke GetVolumeInformation,lpRootPathName,lpVolumeNameBuffer,dwVolumeNameSize,lpVolumeSerialNumber,lpMaximumComponentLength,lpFileSystemFlags,lpFileSystemNameBuffer,dwFileSystemNameSize

lpRootPathName:指向需要检测的驱动器根目录字符串,如果是网络驱动器,可以是'\服务器名共享名'
lpVolumeNameBuffer:指向一个字符串缓冲区,用来返回驱动器的卷标,缓冲区长度由dwVolumeNameSize参数指出
lpVolumeSerialNumber:指向一个双字变量,在这里返回逻辑驱动器的序列号,序列号是驱动器被格式化的时候由系统随机产生的一个32位数,它保存在位于驱动器第一个扇区的引导记录中.
lpMaximumComponentLength:指向一个双字变量,在这里返回最大允许的文件名长度,windows中为255
lpFileSystemFlags:指向一个双字变量,在这里返回一些逻辑驱动器的属性标志返回值可能是下列值的组合
FS_CASE_IS_PRESERVED:文件系统保存文件名时保持它的大小写
FS_CASE_SENSITIVE:支持区分大小写的文件名
FS_UNICODE_STORED_ON_DISK:允许存放Unicode格式的文件名
FS_PERSISTENT_ACLS:支持ACL
FS_FILE_COMPRESSION:支持文件压缩
FS_VOL_IS_COMPRESSED:支持卷压缩
lpFileSystemNameBuffer:指向一个字符串缓冲区,用来接收文件系统字符串,类似于'NTFS'或'FAT32'之类的dwFileSystemNameSize指定了这个缓冲区的长度

检测逻辑驱动器剩余空间GetDiskFreeSpace用法如下

invoke GetDiskFreeSpace,lpRootPathName,lpSectorsPerCluster,lpBytesPerSector,lpNumberOfFreeClusters,lpTotalNumberOfClusters

lpRootPathName:指向驱动器根目录字符串
lpSectorsPerCluster:返回每簇的扇区数
lpBytesPerSector:返回每扇区的字节数
lpNumberOfFreeClusters:返回驱动器中未使用的簇的数量
lpTotalNumberOfClusters:返回驱动器中簇的总数

Windows 文件操作 — 其它文件操作

1.拷贝文件
拷贝文使用CopyFile或CopyFileEx

invoke CopyFile,lpExistingFileName,lpNewFileName,bFailIfExists

函数将lpExistingFileName指定文件拷贝为lpNewFileName指定的文件
bFailIfExists指定目标存在时的动作,指定为TRUE,拷贝失败;指定为FALSE则覆盖掉原来的文件,拷贝出来的新文件的属性和原来文件的属性一样
CopyFileEx函数可以完成同样的功能,只不过函数可以指定一个回调函数.

2.移动文件
移动文件使用MoveFile或MoveFileEx

invoke MoveFile,lpExistingFileName,lpNewFileName

将lpExistingFileName指定的文件移动到lpNewFileName指定的目标位置,文件名可以同时改变或不改变,目标文件必须不存在,否则函数调用失败.当函数执行成功的时候返回非0值,否则函数返回0
注意:MoveFile函数可以移动文件或目录.当移动一个文件时,源文件和目标文件可以处于不同的驱动器上
当移动对象是一个文件夹时,源目录与目标目录必须在一个驱动器上

invoke MoveFileEx,lpExistingFileName,lpNewFileName,dwFlags

MoveFileEx函数增加了一个dwFlags参数来时行移动控制,参数可以是下面取值的组合
MOVEFILE_COPY_ALLOWED:允许拷贝数据,如果不指定,文件不能移动到不同的驱动器上,不能与REBOOT同时使用
MOVEFILE_DELAY_UNTIL_REBOOT:在Winnt上执行时,函数在下一次启动时再进行移动操作
MOVEFILE_REPLACE_EXISTING:如果目标存在,将它替换掉(与MoveFile相比的优点)
MoveFileEx还有个特殊用法

invoke MoveFileEx,lpExistingFileName,NULL,MOVEFILE_DELAY_UNTIL_REBOOT

将在下一次启动时将lpExistingFileName指定的文件删除(Win95不支持)

3.删除文件
删除文件使用DeleteFile函数

invoke DeleteFile,lpFileName

lpFileName指向一个包含要删除文件名的字符串.在Win95下执行时,可以删除打开状态的文件,在NT下执行,不能对一个打开的文件进行删除.

Windows 文件操作 — 文件属性

1.Win32的文件函数可以操作多种对象,用GetFileType函数可以得到操作对象的类型.

invoke GetFileType,hFile

该函数返回值有4种
FILE_TYPE_UNKNOWN 文件类型未知
FILE_TYPE_DISK 磁盘文件
FILE_TYPE_CHAR 字符设备
FILE_TYPE_PIPE 管道

2.获取文件长度
使用GetFileSize函数

invoke GetFileSize,hFile,lpFileSizeHigh

lpFileSizeHigh指向一个用来接收高32位长度的变量,一般设置为NULL,长度的低32位在函数的返回值中返回,GetFileSize返回的是当前长度

3.获取和修改文件日期
获取文件日期使用GetFileTime

invoke GetFileTime,hFile,lpCreationTime,lpLastAccessTime,lpLastWriteTime

hFile:操作文件句柄
lpCreationTime:创建日期
lpLastAccessTime:最后存取日期
lpLastWriteTime:最后写入日期
如果不需要某个日期可将它设置为NULL
返回的日期是个FILETIME 结构

FILETIME STRUCT
dwLowDateTime DWORD ? ;文件日期低32位
dwHighDateTime DWORD ? ;文件日期高32位
FILETIME ENDS

这个结构中无法直接得到日期的年月日时分秒等数据.转换FILETIME为SYSTEMTIME结构,使用FileTimeToSystemTime进行转换

invoke FileTimeToSystemTime,lpFileTime,lpSystemTime

设置日期

invoke SetFileTime,hFile,lpCreationTime,lpLastAccessTime,lpLastWriteTime

填写FILETIME结构的时候,最简便的方法

invoke SystemTimeToFileTime,lpSystemTime,lpFileTime

4.获取和修改文件属性
创建文件是,可以在CreateFile的dwFlagsAndAttributes参数指定,也可以在以后用SetFileAttributes修改属性

invoke SetFileAttributes,lpFileName,dwFileAttributes

调用SetFileAttributes不需要打开文件上,只要指定全路径的文件名就可以了
dwFileAttributes与dwFlagsAndAttributes的参数是一样的

获取文件的只读,隐含与系统等属性,可以使用GetFileAttributes

invoke GetFileAttributes,lpFimeName

如果函数执行失败返回-1 成功返回文件的属性

Windows 文件操作 — 查找文件

开始查找文件,首先使用FindFirstFile函数,如果函数执行成功,返回一个句柄hFindFile来对应这个寻找操作,接下来可以利用这个句柄循环调用FindNextFile继续查找其它文件,直到FindNextFile返回失败为止.最后关闭hFindFile句柄.一般查找文件的代码结构:

invoke FindFirstFile,lpFindFile,lpFindFileDate
.if eax != INVALID_HANDLE_VALUE
mov hFindFile,eax
.repeat
;处理本次找到的文件
invoke FindNextFile,hFindFile,addr lpFindFileData
.until eax==FALSE
invoke FindClose,hFindFile
.endif

FindFirstFile的参数lpFindFile指向一个字符串,代表要寻找的文件名,如果文件名中不锯含路径,将在当前目录中查找文件.在文件名中可以包含'*'或'?'通配符
FindFirstFile函数和FindNextFile函数中的lpFindFileData参数则指向一个缓冲区,函数会在缓冲区中返回一个WIN_FIND_DATA结构,结构中包括了Windows查找过程中临时使用的数据和找到的文件名与属性等数据,该结构定义如下:

WIN32_FIND_DATA STRUCT
dwFileAttributes DWORD ? ;文件属性
ftCreationTime FILETIME <> ;文件的创建日期
ftLastAccessTime FILETIME <> ;文件的最后存取日期
ftlastWriteTime FILETIME <> ;文件的最后修改日期
nFileSizeHigh DWORD ? ;文件长度的高32位
nFileSizeLow DWORD ? ;文件长度的低32位
dwReserved0 DWORD ? ;内部使用
dwReserved1 DWORD ? ;内部使用
cFileName BYTE MAX_PATH dup(?) ;本次找到的文件名
cAlternate BYTE 14 dup(?) ;文件的8.3结构的短文件名
WIN32_FIND_DATA ENDS

dwFileAttributes字段可以是下面取值的组合,通过它可以检查找到的是一个文件还是一个子目录,以及属性
FILE_ATTRIBUTE_ARCHIVE:文件包含归档属性
FILE_ATTRIBUTE_COMPRESSED:文件和目录被压缩
FILE_ATTRIBUTE_DIRECTORY:找到的是一个目录
FILE_ATTRIBUTE_HIDDEN:文件包含隐含属性
FILE_ATTRIBUTE_NORMAL:文件没有其它属性
FILE_ATTRIBUTE_READONLY:文件包含只读属性
FILE_ATTRIBUTE_SYSTEM:文件包含系统属性
FILE_ATTRIBUTE_TEMPORARY:文件是一个临时文件
注意:cFileName字段中包括了找到的文件名,这个文件名中并不包含路径.