CS代写 WOW64_32KEY)

# Copyright (c) 2012 Terence Honles (maintainer)
# Copyright (c) 2008 (author)
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above

Copyright By PowCoder代写 加微信 powcoder

# copyright notice and this permission notice appear in all copies.
# THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

from __future__ import print_function, absolute_import, division

import ctypes
import errno
import logging
import warnings

from ctypes.util import find_library
from platform import machine, system
from signal import signal, SIGINT, SIG_DFL
from stat import S_IFDIR
from traceback import print_exc

from functools import partial
except ImportError:
# http://docs.python.org/library/functools.html#functools.partial
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)

newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc

basestring
except NameError:
basestring = str

log = logging.getLogger(“fuse”)
_system = system()
_machine = machine()

if _system == ‘Windows’:
# sizeof(long)==4 on Windows 32-bit and 64-bit
# sizeof(long)==4 on Cygwin 32-bit and ==8 on Cygwin 64-bit
# We have to fix up c_long and c_ulong so that it matches the
# Cygwin (and UNIX) sizes when run on Windows.
import sys
if sys.maxsize > 0xffffffff:
c_win_long = ctypes.c_int64
c_win_ulong = ctypes.c_uint64
c_win_long = ctypes.c_int32
c_win_ulong = ctypes.c_uint32

if _system == ‘Windows’ or _system.startswith(‘CYGWIN’):
class c_timespec(ctypes.Structure):
_fields_ = [(‘tv_sec’, c_win_long), (‘tv_nsec’, c_win_long)]
class c_timespec(ctypes.Structure):
_fields_ = [(‘tv_sec’, ctypes.c_long), (‘tv_nsec’, ctypes.c_long)]

class c_utimbuf(ctypes.Structure):
_fields_ = [(‘actime’, c_timespec), (‘modtime’, c_timespec)]

class c_stat(ctypes.Structure):
pass # Platform dependent

_libfuse_path = os.environ.get(‘FUSE_LIBRARY_PATH’)
if not _libfuse_path:
if _system == ‘Darwin’:
# libfuse dependency
_libiconv = ctypes.CDLL(find_library(‘iconv’), ctypes.RTLD_GLOBAL)

_libfuse_path = (find_library(‘fuse4x’) or find_library(‘osxfuse’) or
find_library(‘fuse’))
elif _system == ‘Windows’:
import _winreg as reg
except ImportError:
import winreg as reg
def Reg32GetValue(rootkey, keyname, valname):
key, val = None, None
key = reg.OpenKey(rootkey, keyname, 0, reg.KEY_READ | reg.KEY_WOW64_32KEY)
val = str(reg.QueryValueEx(key, valname)[0])
except WindowsError:
if key is not None:
reg.CloseKey(key)
return val
_libfuse_path = Reg32GetValue(reg.HKEY_LOCAL_MACHINE, r”SOFTWARE\WinFsp”, r”InstallDir”)
if _libfuse_path:
_libfuse_path += r”bin\winfsp-%s.dll” % (“x64” if sys.maxsize > 0xffffffff else “x86”)
_libfuse_path = find_library(‘fuse’)

if not _libfuse_path:
raise EnvironmentError(‘Unable to find libfuse’)
_libfuse = ctypes.CDLL(_libfuse_path)

if _system == ‘Darwin’ and hasattr(_libfuse, ‘macfuse_version’):
_system = ‘Darwin-MacFuse’

if _system in (‘Darwin’, ‘Darwin-MacFuse’, ‘FreeBSD’):
ENOTSUP = 45

c_dev_t = ctypes.c_int32
c_fsblkcnt_t = ctypes.c_ulong
c_fsfilcnt_t = ctypes.c_ulong
c_gid_t = ctypes.c_uint32
c_mode_t = ctypes.c_uint16
c_off_t = ctypes.c_int64
c_pid_t = ctypes.c_int32
c_uid_t = ctypes.c_uint32
setxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t, ctypes.c_int,
ctypes.c_uint32)
getxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte),
ctypes.c_size_t, ctypes.c_uint32)
if _system == ‘Darwin’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_uint16),
(‘st_ino’, ctypes.c_uint64),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec),
(‘st_birthtimespec’, c_timespec),
(‘st_size’, c_off_t),
(‘st_blocks’, ctypes.c_int64),
(‘st_blksize’, ctypes.c_int32),
(‘st_flags’, ctypes.c_int32),
(‘st_gen’, ctypes.c_int32),
(‘st_lspare’, ctypes.c_int32),
(‘st_qspare’, ctypes.c_int64)]
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_uint32),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_uint16),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec),
(‘st_size’, c_off_t),
(‘st_blocks’, ctypes.c_int64),
(‘st_blksize’, ctypes.c_int32)]
elif _system == ‘Linux’:
ENOTSUP = 95

c_dev_t = ctypes.c_ulonglong
c_fsblkcnt_t = ctypes.c_ulonglong
c_fsfilcnt_t = ctypes.c_ulonglong
c_gid_t = ctypes.c_uint
c_mode_t = ctypes.c_uint
c_off_t = ctypes.c_longlong
c_pid_t = ctypes.c_int
c_uid_t = ctypes.c_uint
setxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t, ctypes.c_int)

getxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t)

if _machine == ‘x86_64’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_ulong),
(‘st_nlink’, ctypes.c_ulong),
(‘st_mode’, c_mode_t),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘__pad0’, ctypes.c_int),
(‘st_rdev’, c_dev_t),
(‘st_size’, c_off_t),
(‘st_blksize’, ctypes.c_long),
(‘st_blocks’, ctypes.c_long),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec)]
elif _machine == ‘mips’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘__pad1_1’, ctypes.c_ulong),
(‘__pad1_2’, ctypes.c_ulong),
(‘__pad1_3’, ctypes.c_ulong),
(‘st_ino’, ctypes.c_ulong),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_ulong),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘__pad2_1’, ctypes.c_ulong),
(‘__pad2_2’, ctypes.c_ulong),
(‘st_size’, c_off_t),
(‘__pad3’, ctypes.c_ulong),
(‘st_atimespec’, c_timespec),
(‘__pad4’, ctypes.c_ulong),
(‘st_mtimespec’, c_timespec),
(‘__pad5’, ctypes.c_ulong),
(‘st_ctimespec’, c_timespec),
(‘__pad6’, ctypes.c_ulong),
(‘st_blksize’, ctypes.c_long),
(‘st_blocks’, ctypes.c_long),
(‘__pad7_1’, ctypes.c_ulong),
(‘__pad7_2’, ctypes.c_ulong),
(‘__pad7_3’, ctypes.c_ulong),
(‘__pad7_4’, ctypes.c_ulong),
(‘__pad7_5’, ctypes.c_ulong),
(‘__pad7_6’, ctypes.c_ulong),
(‘__pad7_7’, ctypes.c_ulong),
(‘__pad7_8’, ctypes.c_ulong),
(‘__pad7_9’, ctypes.c_ulong),
(‘__pad7_10’, ctypes.c_ulong),
(‘__pad7_11’, ctypes.c_ulong),
(‘__pad7_12’, ctypes.c_ulong),
(‘__pad7_13’, ctypes.c_ulong),
(‘__pad7_14’, ctypes.c_ulong)]
elif _machine == ‘ppc’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_ulonglong),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_uint),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘__pad2’, ctypes.c_ushort),
(‘st_size’, c_off_t),
(‘st_blksize’, ctypes.c_long),
(‘st_blocks’, ctypes.c_longlong),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec)]
elif _machine == ‘ppc64’ or _machine == ‘ppc64le’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_ulong),
(‘st_nlink’, ctypes.c_ulong),
(‘st_mode’, c_mode_t),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘__pad’, ctypes.c_uint),
(‘st_rdev’, c_dev_t),
(‘st_size’, c_off_t),
(‘st_blksize’, ctypes.c_long),
(‘st_blocks’, ctypes.c_long),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec)]
elif _machine == ‘aarch64’:
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_ulong),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_uint),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘__pad1’, ctypes.c_ulong),
(‘st_size’, c_off_t),
(‘st_blksize’, ctypes.c_int),
(‘__pad2’, ctypes.c_int),
(‘st_blocks’, ctypes.c_long),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec)]
# i686, use as fallback for everything else
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘__pad1’, ctypes.c_ushort),
(‘__st_ino’, ctypes.c_ulong),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_uint),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘__pad2’, ctypes.c_ushort),
(‘st_size’, c_off_t),
(‘st_blksize’, ctypes.c_long),
(‘st_blocks’, ctypes.c_longlong),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec),
(‘st_ino’, ctypes.c_ulonglong)]
elif _system == ‘Windows’ or _system.startswith(‘CYGWIN’):
ENOTSUP = 129 if _system == ‘Windows’ else 134
c_dev_t = ctypes.c_uint
c_fsblkcnt_t = c_win_ulong
c_fsfilcnt_t = c_win_ulong
c_gid_t = ctypes.c_uint
c_mode_t = ctypes.c_uint
c_off_t = ctypes.c_longlong
c_pid_t = ctypes.c_int
c_uid_t = ctypes.c_uint
setxattr_t = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t, ctypes.c_int)
getxattr_t = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t)
c_stat._fields_ = [
(‘st_dev’, c_dev_t),
(‘st_ino’, ctypes.c_ulonglong),
(‘st_mode’, c_mode_t),
(‘st_nlink’, ctypes.c_ushort),
(‘st_uid’, c_uid_t),
(‘st_gid’, c_gid_t),
(‘st_rdev’, c_dev_t),
(‘st_size’, c_off_t),
(‘st_atimespec’, c_timespec),
(‘st_mtimespec’, c_timespec),
(‘st_ctimespec’, c_timespec),
(‘st_blksize’, ctypes.c_int),
(‘st_blocks’, ctypes.c_longlong),
(‘st_birthtimespec’, c_timespec)]
raise NotImplementedError(‘%s is not supported.’ % _system)

if _system == ‘FreeBSD’:
c_fsblkcnt_t = ctypes.c_uint64
c_fsfilcnt_t = ctypes.c_uint64
setxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t, ctypes.c_int)

getxattr_t = ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p,
ctypes.POINTER(ctypes.c_byte), ctypes.c_size_t)

class c_statvfs(ctypes.Structure):
_fields_ = [
(‘f_bavail’, c_fsblkcnt_t),
(‘f_bfree’, c_fsblkcnt_t),
(‘f_blocks’, c_fsblkcnt_t),
(‘f_favail’, c_fsfilcnt_t),
(‘f_ffree’, c_fsfilcnt_t),
(‘f_files’, c_fsfilcnt_t),
(‘f_bsize’, ctypes.c_ulong),
(‘f_flag’, ctypes.c_ulong),
(‘f_frsize’, ctypes.c_ulong)]
elif _system == ‘Windows’ or _system.startswith(‘CYGWIN’):
class c_statvfs(ctypes.Structure):
_fields_ = [
(‘f_bsize’, c_win_ulong),
(‘f_frsize’, c_win_ulong),
(‘f_blocks’, c_fsblkcnt_t),
(‘f_bfree’, c_fsblkcnt_t),
(‘f_bavail’, c_fsblkcnt_t),
(‘f_files’, c_fsfilcnt_t),
(‘f_ffree’, c_fsfilcnt_t),
(‘f_favail’, c_fsfilcnt_t),
(‘f_fsid’, c_win_ulong),
(‘f_flag’, c_win_ulong),
(‘f_namemax’, c_win_ulong)]
class c_statvfs(ctypes.Structure):
_fields_ = [
(‘f_bsize’, ctypes.c_ulong),
(‘f_frsize’, ctypes.c_ulong),
(‘f_blocks’, c_fsblkcnt_t),
(‘f_bfree’, c_fsblkcnt_t),
(‘f_bavail’, c_fsblkcnt_t),
(‘f_files’, c_fsfilcnt_t),
(‘f_ffree’, c_fsfilcnt_t),
(‘f_favail’, c_fsfilcnt_t),
(‘f_fsid’, ctypes.c_ulong),
# (‘unused’, ctypes.c_int),
(‘f_flag’, ctypes.c_ulong),
(‘f_namemax’, ctypes.c_ulong)]

if _system == ‘Windows’ or _system.startswith(‘CYGWIN’):
class fuse_file_info(ctypes.Structure):
_fields_ = [
(‘flags’, ctypes.c_int),
(‘fh_old’, ctypes.c_int),
(‘writepage’, ctypes.c_int),
(‘direct_io’, ctypes.c_uint, 1),
(‘keep_cache’, ctypes.c_uint, 1),
(‘flush’, ctypes.c_uint, 1),
(‘padding’, ctypes.c_uint, 29),
(‘fh’, ctypes.c_uint64),
(‘lock_owner’, ctypes.c_uint64)]
class fuse_file_info(ctypes.Structure):
_fields_ = [
(‘flags’, ctypes.c_int),
(‘fh_old’, ctypes.c_ulong),
(‘writepage’, ctypes.c_int),
(‘direct_io’, ctypes.c_uint, 1),
(‘keep_cache’, ctypes.c_uint, 1),
(‘flush’, ctypes.c_uint, 1),
(‘nonseekable’, ctypes.c_uint, 1),
(‘flock_release’, ctypes.c_uint, 1),
(‘padding’, ctypes.c_uint, 27),
(‘fh’, ctypes.c_uint64),
(‘lock_owner’, ctypes.c_uint64)]

class fuse_context(ctypes.Structure):
_fields_ = [
(‘fuse’, ctypes.c_voidp),
(‘uid’, c_uid_t),
(‘gid’, c_gid_t),
(‘pid’, c_pid_t),
(‘private_data’, ctypes.c_voidp)]

_libfuse.fuse_get_context.restype = ctypes.POINTER(fuse_context)

class fuse_operations(ctypes.Structure):
_fields_ = [
(‘getattr’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(c_stat))),

(‘readlink’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(ctypes.c_byte),
ctypes.c_size_t)),

(‘getdir’, ctypes.c_voidp), # Deprecated, use readdir

(‘mknod’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, c_mode_t, c_dev_t)),

(‘mkdir’, ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p, c_mode_t)),
(‘unlink’, ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p)),
(‘rmdir’, ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p)),

(‘symlink’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p)),

(‘rename’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p)),

(‘link’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p)),

(‘chmod’, ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p, c_mode_t)),

(‘chown’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, c_uid_t, c_gid_t)),

(‘truncate’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, c_off_t)),

(‘utime’, ctypes.c_voidp), # Deprecated, use utimens
(‘open’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info))),

(‘read’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(ctypes.c_byte),
ctypes.c_size_t, c_off_t, ctypes.POINTER(fuse_file_info))),

(‘write’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(ctypes.c_byte),
ctypes.c_size_t, c_off_t, ctypes.POINTER(fuse_file_info))),

(‘statfs’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(c_statvfs))),

(‘flush’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info))),

(‘release’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info))),

(‘fsync’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_int,
ctypes.POINTER(fuse_file_info))),

(‘setxattr’, setxattr_t),
(‘getxattr’, getxattr_t),

(‘listxattr’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(ctypes.c_byte),
ctypes.c_size_t)),

(‘removexattr’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p)),

(‘opendir’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info))),

(‘readdir’, ctypes.CFUNCTYPE(
ctypes.c_int,
ctypes.c_char_p,
ctypes.c_voidp,
ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_voidp, ctypes.c_char_p,
ctypes.POINTER(c_stat), c_off_t),
ctypes.POINTER(fuse_file_info))),

(‘releasedir’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info))),

(‘fsyncdir’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_int,
ctypes.POINTER(fuse_file_info))),

(‘init’, ctypes.CFUNCTYPE(ctypes.c_voidp, ctypes.c_voidp)),
(‘destroy’, ctypes.CFUNCTYPE(ctypes.c_voidp, ctypes.c_voidp)),

(‘access’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.c_int)),

(‘create’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, c_mode_t,
ctypes.POINTER(fuse_file_info))),

(‘ftruncate’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, c_off_t,
ctypes.POINTER(fuse_file_info))),

(‘fgetattr’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(c_stat),
ctypes.POINTER(fuse_file_info))),

(‘lock’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(fuse_file_info),
ctypes.c_int, ctypes.c_voidp)),

(‘utimens’, ctypes.CFUNCTYPE(
ctypes.c_int, ctypes.c_char_p, ctype

程序代写 CS代考 加微信: powcoder QQ: 1823890830 Email: powcoder@163.com