?? access.cpp
字號:
// access.cpp
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "msc.h"
#include "access.h"
#include "filename.h"
#include "stringex.h"
// 偹傫偺偨傔 FILE_TYPE_REMOTE (0x8000) 傪偼偢偡
#define GetFileType(h) ( GetFileType ( h ) & ~ FILE_TYPE_REMOTE )
#define FILE_ACCESS_TESTSHARE ( FILE_ACCESS_EXIST | FILE_ACCESS_READ | FILE_ACCESS_WRITE | FILE_ACCESS_VALID )
#define FILE_ACCESS_TESTTYPE ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY | FILE_ACCESS_DEVICE )
//////////////////////////////
// ANSI斉 //
//////////////////////////////
static int IsReservedDeviceNameA ( const char *szFileName ) ;
// 僼傽僀儖偺傾僋僙僗尃傪専嵏乮ANSI斉乯
// dwFlags 偵巜掕偝傟偨忦審偵崌偆側傜偽 0 埲奜傪曉偡
int IsFileAccessibleA ( const char *szFileName, unsigned long dwFlags ) {
if ( ( dwFlags & FILE_ACCESS_TESTTYPE ) == 0 ) dwFlags |= FILE_ACCESS_TESTTYPE ;
if ( ( dwFlags & FILE_ACCESS_TESTSHARE ) == 0 ) dwFlags |= FILE_ACCESS_EXIST ;
// 僨僶僀僗偑懚嵼
if ( IsReservedDeviceNameA ( szFileName ) ) {
if ( dwFlags & FILE_ACCESS_DEVICE ) {
return 1 ;
}
}
else {
unsigned long dwFileAttributes = GetFileAttributesA ( szFileName ) ;
if ( dwFileAttributes != (unsigned long) -1 ) {
// 僨傿儗僋僩儕偑懚嵼
if ( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
if ( dwFlags & FILE_ACCESS_DIRECTORY ) {
if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_READ ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_WRITE ) {
if ( ! ( dwFileAttributes & FILE_ATTRIBUTE_READONLY ) ) return 1 ;
}
}
}
// 僼傽僀儖偑懚嵼
else {
if ( dwFlags & FILE_ACCESS_FILE ) {
if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_READ ) {
HANDLE hFile ;
if ( ( hFile = CreateFileA ( szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
if ( dwFlags & FILE_ACCESS_WRITE ) {
HANDLE hFile ;
if ( ( hFile = CreateFileA ( szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
}
}
}
// 僨傿儗僋僩儕傑偨偼僼傽僀儖偑懚嵼偟側偄
else {
if ( dwFlags & ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY ) ) {
if ( dwFlags & ( FILE_ACCESS_WRITE | FILE_ACCESS_VALID ) ) {
HANDLE hFile ;
if ( ( hFile = CreateFileA ( szFileName, GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
}
}
}
return 0 ;
}
// 梊栺偝傟偨僨僶僀僗柤偐偳偆偐曉偡
static int IsReservedDeviceNameA ( const char *szFileName ) {
static const char szLongPathHead [] = "\\\\?\\" ; // for "\\?\C:\<path>", "\\?\UNC\<server>\<share>"
if ( ! strheadcmp ( szFileName, szLongPathHead ) ) return 0 ;
szFileName = GetFileNameA ( szFileName ) ;
if ( ! szFileName ) return 0 ;
char szTmp [ MAX_PATH ] ;
strlcpy ( szTmp, szFileName, MAX_PATH ) ;
while ( GetExtensionA ( szTmp ) ) ChangeExtensionA ( szTmp, NULL ) ;
if ( ! stricmp ( szTmp, "CON" ) ) return 1 ;
if ( ! stricmp ( szTmp, "PRN" ) ) return 1 ;
if ( ! stricmp ( szTmp, "AUX" ) ) return 1 ;
if ( ! stricmp ( szTmp, "CLOCK$" ) ) return 1 ;
if ( ! stricmp ( szTmp, "NUL" ) ) return 1 ;
if ( ! strheadicmp ( szTmp, "COM" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
if ( ! strheadicmp ( szTmp, "LPT" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
return 0 ;
}
//////////////////////////////
// UNICODE斉 //
//////////////////////////////
static int IsReservedDeviceNameW ( const wchar_t *szFileName ) ;
// 僼傽僀儖偺傾僋僙僗尃傪専嵏乮UNICODE斉乯
// dwFlags 偵巜掕偝傟偨忦審偵崌偆側傜偽 0 埲奜傪曉偡
int IsFileAccessibleW ( const wchar_t *szFileName, unsigned long dwFlags ) {
if ( ( dwFlags & FILE_ACCESS_TESTTYPE ) == 0 ) dwFlags |= FILE_ACCESS_TESTTYPE ;
if ( ( dwFlags & FILE_ACCESS_TESTSHARE ) == 0 ) dwFlags |= FILE_ACCESS_EXIST ;
// 僨僶僀僗偑懚嵼
if ( IsReservedDeviceNameW ( szFileName ) ) {
if ( dwFlags & FILE_ACCESS_DEVICE ) {
return 1 ;
}
}
else {
unsigned long dwFileAttributes = GetFileAttributesW ( szFileName ) ;
if ( dwFileAttributes != (unsigned long) -1 ) {
// 僨傿儗僋僩儕偑懚嵼
if ( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
if ( dwFlags & FILE_ACCESS_DIRECTORY ) {
if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_READ ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_WRITE ) {
if ( ! ( dwFileAttributes & FILE_ATTRIBUTE_READONLY ) ) return 1 ;
}
}
}
// 僼傽僀儖偑懚嵼
else {
if ( dwFlags & FILE_ACCESS_FILE ) {
if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
return 1 ;
}
if ( dwFlags & FILE_ACCESS_READ ) {
HANDLE hFile ;
if ( ( hFile = CreateFileW ( szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
if ( dwFlags & FILE_ACCESS_WRITE ) {
HANDLE hFile ;
if ( ( hFile = CreateFileW ( szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
}
}
}
// 僨傿儗僋僩儕傑偨偼僼傽僀儖偑懚嵼偟側偄
else {
if ( dwFlags & ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY ) ) {
if ( dwFlags & ( FILE_ACCESS_WRITE | FILE_ACCESS_VALID ) ) {
HANDLE hFile ;
if ( ( hFile = CreateFileW ( szFileName, GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ) != INVALID_HANDLE_VALUE ) {
unsigned long dwFileType = GetFileType ( hFile ) ;
CloseHandle ( hFile ) ;
if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
}
}
}
}
}
return 0 ;
}
// 梊栺偝傟偨僨僶僀僗柤偐偳偆偐曉偡
// 僷僗柤側偟偺僼傽僀儖柤傪巜掕偡傞
static int IsReservedDeviceNameW ( const wchar_t *szFileName ) {
static const wchar_t szLongPathHead [] = L"\\\\?\\" ; // for "\\?\C:\<path>", "\\?\UNC\<server>\<share>"
if ( ! wcsheadcmp ( szFileName, szLongPathHead ) ) return 0 ;
szFileName = GetFileNameW ( szFileName ) ;
if ( ! szFileName ) return 0 ;
wchar_t szTmp [ MAX_PATH ] ;
wcslcpy ( szTmp, szFileName, MAX_PATH ) ;
while ( GetExtensionW ( szTmp ) ) ChangeExtensionW ( szTmp, NULL ) ;
if ( ! wcsicmp ( szTmp, L"CON" ) ) return 1 ;
if ( ! wcsicmp ( szTmp, L"PRN" ) ) return 1 ;
if ( ! wcsicmp ( szTmp, L"AUX" ) ) return 1 ;
if ( ! wcsicmp ( szTmp, L"CLOCK$" ) ) return 1 ;
if ( ! wcsicmp ( szTmp, L"NUL" ) ) return 1 ;
if ( ! wcsheadicmp ( szTmp, L"COM" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
if ( ! wcsheadicmp ( szTmp, L"LPT" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
return 0 ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -