Skip to content

Commit

Permalink
Fix: 二进制清理 (#86)
Browse files Browse the repository at this point in the history
Co-authored-by: yvanpeng <[email protected]>
  • Loading branch information
yuanyuan100 and yvanpeng authored May 29, 2024
1 parent 0d2187a commit 7ab09f0
Show file tree
Hide file tree
Showing 16 changed files with 267 additions and 20 deletions.
4 changes: 2 additions & 2 deletions Lemon/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>5.1.8</string>
<string>5.1.9</string>
<key>CFBundleVersion</key>
<string>1015</string>
<string>1016</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSAppTransportSecurity</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#import "CutBinary.h"
#import "InstallAppHelper.h"
#import <QMCoreFunction/QMShellExcuteHelper.h>
#import <QMCoreFunction/McCoreFunction.h>
#include <sys/sysctl.h>

#define MAX_FAT_HEADER_SIZE (20*20)
Expand All @@ -26,7 +27,18 @@
options:flags errorHandler:nil]

#define kWhiteAppleAppBundleID @[@"com.apple.Safari",@"com.apple.dt.Xcode",@"com.apple.appleseed.FeedbackAssistant"]
#define kWhiteCommonAppBundleID @[@"com.microsoft.VSCode",@"com.parallels.desktop.console"]
#define kWhiteCommonAppBundleID @[ \
@"com.microsoft.VSCode", \
@"com.parallels.desktop.console", \
@"com.tencent.xinWeChat", \
@"com.tencent.WeWorkMac", \
@"com.tencent.qq", \
@"com.tencent.meeting", \
@"com.alibaba.DingTalkMac", \
@"5ZSL2CJU2T.com.dingtalk.mac", \
@"com.electron.lark", \
@"com.bytedance.macos.feishu",\
]

@implementation QMAppUnlessFile
@synthesize delegate;
Expand Down Expand Up @@ -448,7 +460,14 @@ - (void)scanAppInstallPackage:(QMActionItem *)actionItem{
}

- (void)scanAppGeneralBinary:(QMActionItem *)actionItem {

// 根据线上反馈13.0以上需要判断
if (@available(macOS 13.0, *)) {
/// 守护进程无 完全磁盘访问权限,lipo [input path] -thin [架构] -output [output path] 时output会失败,导致Application/下的二进制文件为空
if ([[McCoreFunction shareCoreFuction] getFullDiskAccessForDaemon] != QMFullDiskAuthorationStatusAuthorized) {
return;
}
}

NSMutableDictionary *installBundleIdDic = [InstallAppHelper getInstallBundleIds];
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Expand Down Expand Up @@ -489,9 +508,12 @@ - (void)scanAppGeneralBinary:(QMActionItem *)actionItem {
NSString *libraryPath = [NSString stringWithFormat:@"%@/Contents/Library",appPath];
NSArray *libraryArr = [manager subpathsOfDirectoryAtPath:libraryPath error:&err];
if (libraryArr != nil && libraryArr.count > 0) {
for (NSString *str in frameworksArr) {
NSString *path = [NSString stringWithFormat:@"%@/%@",libraryPath,str];
[dirArr addObject:path];
for (NSString *str in libraryArr) {
// Library下除LoginItems外作为资源文件参与gatekeeper验证
if ([str hasPrefix:@"LoginItems"]) {
NSString *path = [NSString stringWithFormat:@"%@/%@",libraryPath,str];
[dirArr addObject:path];
}
}
}

Expand Down Expand Up @@ -521,6 +543,10 @@ - (void)scanAppGeneralBinary:(QMActionItem *)actionItem {
if (AppBinaryType_None != type) {
//获取app中有对应架构的二进制
for (NSString *path in dirArr) {
// gatekeeper会验证资源文件的完整性,不完整则会损坏
if ([path containsString:@"/Resources/"]) {
continue;
}
NSString *newPath = path;//[appPath stringByAppendingPathComponent:path];
NSString *description = [workSpace localizedDescriptionForType:[workSpace typeOfFile:newPath error:nil]];
if ([description containsString:@"可执行"] || [description containsString:@"Unix executable"] ) {
Expand Down Expand Up @@ -552,8 +578,10 @@ - (void)scanAppGeneralBinary:(QMActionItem *)actionItem {
});
}
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 120ull * NSEC_PER_SEC);
dispatch_group_wait(group, time);

long result = dispatch_group_wait(group, time);
if (result != 0) {
NSLog(@"scan binary timeout");
}
}

#pragma mark-
Expand Down
7 changes: 7 additions & 0 deletions LemonClener/LemonClener/libcleaner/QMXMLItemDefine.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,13 @@

#define kIconImageSize 16

#pragma mark - 清理项相关Id定义
#define QMCategoryTrashItemId @"1006" // 垃圾篓
#define QMCategoryDownloadItemId @"1007" // 下载
#define QMCategoryUniversalBinaryItemId @"20402" // 通用二进制
#define QMCategoryMailCacheItemId @"301" // Mail缓存


// 扫描类型
typedef enum
{
Expand Down
17 changes: 16 additions & 1 deletion LemonClener/LemonClener/libcleaner/QMXMLParse.m
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,11 @@ - (void)createCategorySubItem:(NSDictionary *)attributeDict

//判读bundleid不为空,并且没有安装 --- 将已经适配过的软件加入进来
if ((m_curCategorySubItem.bundleId == nil) || ([m_installBundleIdDic objectForKey:m_curCategorySubItem.bundleId]) || [m_installBundleIdDic objectForKey:m_curCategorySubItem.appStoreBundleId]) {
[m_curCategoryItem addSubCategoryItem:m_curCategorySubItem];
if ([m_curCategorySubItem.subCategoryID isEqualToString:QMCategoryUniversalBinaryItemId]) {
[self createCategorySubItemLogicWhenTypeIsOtherBinary];
} else {
[m_curCategoryItem addSubCategoryItem:m_curCategorySubItem];
}
//加入进来的软件进行移除 剩余的软件进行自适配
if (m_curCategorySubItem.bundleId != nil) {
[m_installBundleIdDic removeObjectForKey:m_curCategorySubItem.bundleId];
Expand All @@ -251,6 +255,17 @@ - (void)createCategorySubItem:(NSDictionary *)attributeDict
}
}

- (void)createCategorySubItemLogicWhenTypeIsOtherBinary {
if (@available(macOS 13.0, *)) {
/// 守护进程无 完全磁盘访问权限,lipo [input path] -thin [架构] -output [output path] 时output会失败,导致Application/下的二进制文件为空
if ([[McCoreFunction shareCoreFuction] getFullDiskAccessForDaemon] == QMFullDiskAuthorationStatusAuthorized) {
[m_curCategoryItem addSubCategoryItem:m_curCategorySubItem];
}
} else {
[m_curCategoryItem addSubCategoryItem:m_curCategorySubItem];
}
}

/*
根据XML创建清理种类对象
*/
Expand Down
20 changes: 20 additions & 0 deletions Tools/LemonDaemon/LemonDaemon.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
76B4C27C287294C000F61386 /* LMDMVersionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B4C27B287294C000F61386 /* LMDMVersionHelper.m */; };
785CA6227A7C5B29A3F7C3D5 /* libPods-LemonDaemon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 71B3D3D30CBDF7DC92261FBF /* libPods-LemonDaemon.a */; };
7A0221CD2865BED8000F9FD4 /* CmcSystem.c in Sources */ = {isa = PBXBuildFile; fileRef = 7A0221CC2865BED8000F9FD4 /* CmcSystem.c */; };
B70F56EC2C070B3800CF49FA /* NSString+Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = B70F56EB2C070B3800CF49FA /* NSString+Extension.m */; };
B79C27C32B84925400838B76 /* CmcSmartQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27B72B84925000838B76 /* CmcSmartQuery.m */; };
B79C27C42B84925400838B76 /* CmcFan.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27B92B84925100838B76 /* CmcFan.m */; };
B79C27C52B84925400838B76 /* CmcAppleSmc.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27BA2B84925100838B76 /* CmcAppleSmc.m */; };
Expand All @@ -21,6 +22,7 @@
B79C27C82B84925400838B76 /* McFanInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27BE2B84925300838B76 /* McFanInfo.m */; };
B79C27C92B84925400838B76 /* McTemperatureInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27C22B84925400838B76 /* McTemperatureInfo.m */; };
B79C27D12B84957700838B76 /* McCpuInfoSMC.m in Sources */ = {isa = PBXBuildFile; fileRef = B79C27D02B84957700838B76 /* McCpuInfoSMC.m */; };
B7C120542BF2308400E7FC82 /* MCPermissions.m in Sources */ = {isa = PBXBuildFile; fileRef = B7C120532BF2308400E7FC82 /* MCPermissions.m */; };
BC6842B8225E0E980074B2D2 /* ExecuteCmdHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6842B6225E0E970074B2D2 /* ExecuteCmdHelper.m */; };
BC8254EE22FA7DF100292FA5 /* LMKextManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8254ED22FA7DF100292FA5 /* LMKextManager.m */; };
D466802221AE8B6500704647 /* LMDaemonXPCService.m in Sources */ = {isa = PBXBuildFile; fileRef = D466802121AE8B6500704647 /* LMDaemonXPCService.m */; };
Expand Down Expand Up @@ -89,6 +91,8 @@
7A0221CB2865BED8000F9FD4 /* CmcSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmcSystem.h; sourceTree = "<group>"; };
7A0221CC2865BED8000F9FD4 /* CmcSystem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CmcSystem.c; sourceTree = "<group>"; };
8A36FA88920478B5FBB32539 /* Pods-LemonDaemon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LemonDaemon.debug.xcconfig"; path = "../../Pods/Target Support Files/Pods-LemonDaemon/Pods-LemonDaemon.debug.xcconfig"; sourceTree = "<group>"; };
B70F56EA2C070B3800CF49FA /* NSString+Extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+Extension.h"; path = "../../../../localPod/QMCoreFunction/QMCoreFunction/Classes/QMExtension/NSString+Extension.h"; sourceTree = "<group>"; };
B70F56EB2C070B3800CF49FA /* NSString+Extension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+Extension.m"; path = "../../../../localPod/QMCoreFunction/QMCoreFunction/Classes/QMExtension/NSString+Extension.m"; sourceTree = "<group>"; };
B79C27B42B84925000838B76 /* McTemperatureInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = McTemperatureInfo.h; sourceTree = "<group>"; };
B79C27B52B84925000838B76 /* CmcSmartQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmcSmartQuery.h; sourceTree = "<group>"; };
B79C27B62B84925000838B76 /* CmcAppleSmc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmcAppleSmc.h; sourceTree = "<group>"; };
Expand All @@ -105,6 +109,8 @@
B79C27C22B84925400838B76 /* McTemperatureInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = McTemperatureInfo.m; sourceTree = "<group>"; };
B79C27CF2B84957700838B76 /* McCpuInfoSMC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = McCpuInfoSMC.h; sourceTree = "<group>"; };
B79C27D02B84957700838B76 /* McCpuInfoSMC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = McCpuInfoSMC.m; sourceTree = "<group>"; };
B7C120522BF2308400E7FC82 /* MCPermissions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCPermissions.h; sourceTree = "<group>"; };
B7C120532BF2308400E7FC82 /* MCPermissions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCPermissions.m; sourceTree = "<group>"; };
BC6842B6225E0E970074B2D2 /* ExecuteCmdHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExecuteCmdHelper.m; sourceTree = "<group>"; };
BC6842B7225E0E970074B2D2 /* ExecuteCmdHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExecuteCmdHelper.h; sourceTree = "<group>"; };
BC8254EC22FA7DF100292FA5 /* LMKextManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LMKextManager.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -246,6 +252,15 @@
path = SMC;
sourceTree = "<group>";
};
B7C120512BF22FE500E7FC82 /* Permission */ = {
isa = PBXGroup;
children = (
B7C120522BF2308400E7FC82 /* MCPermissions.h */,
B7C120532BF2308400E7FC82 /* MCPermissions.m */,
);
path = Permission;
sourceTree = "<group>";
};
BC68427D225D8D260074B2D2 /* cmd */ = {
isa = PBXGroup;
children = (
Expand All @@ -269,6 +284,8 @@
D466802821AE91A600704647 /* LMDaemonListenerDelegate.m */,
BC8254EC22FA7DF100292FA5 /* LMKextManager.h */,
BC8254ED22FA7DF100292FA5 /* LMKextManager.m */,
B70F56EA2C070B3800CF49FA /* NSString+Extension.h */,
B70F56EB2C070B3800CF49FA /* NSString+Extension.m */,
);
path = DaemonXpcService;
sourceTree = "<group>";
Expand Down Expand Up @@ -316,6 +333,7 @@
D4E1D88E20F5F75A001FA263 /* Install */,
D4E1D87620F5F75A001FA263 /* KextMgr */,
D4E1D87A20F5F75A001FA263 /* Launchpad */,
B7C120512BF22FE500E7FC82 /* Permission */,
D4B14D2621A2E41D001E6064 /* LemonBizManager.h */,
D4B14D2721A2E41D001E6064 /* LemonBizManager.m */,
D4E1D85620F5F75A001FA263 /* LemonDaemon-Prefix.pch */,
Expand Down Expand Up @@ -574,12 +592,14 @@
D4E1D89520F5F7C8001FA263 /* CmcFileAction.m in Sources */,
D4E1D89720F5F7C8001FA263 /* McUninstall.m in Sources */,
D4E1D89920F5F7C8001FA263 /* McKextMgr.m in Sources */,
B7C120542BF2308400E7FC82 /* MCPermissions.m in Sources */,
D4E1D89D20F5F7C8001FA263 /* QMLaunchpadClean.m in Sources */,
D4E1D89F20F5F7C8001FA263 /* FMDatabaseQueue.m in Sources */,
D4E1D8A220F5F7C8001FA263 /* FMDatabaseAdditions.m in Sources */,
B79C27C82B84925400838B76 /* McFanInfo.m in Sources */,
D4E1D8A320F5F7C8001FA263 /* FMDatabase.m in Sources */,
D4E1D8A720F5F7C8001FA263 /* FMDatabasePool.m in Sources */,
B70F56EC2C070B3800CF49FA /* NSString+Extension.m in Sources */,
B79C27C52B84925400838B76 /* CmcAppleSmc.m in Sources */,
BC8254EE22FA7DF100292FA5 /* LMKextManager.m in Sources */,
D4B7253F21393F8B003B59B5 /* VideoProcessStat.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#import "ExecuteCmdHelper.h"
#import "LMKextManager.h"
#import <Libproc.h>
#import "MCPermissions.h"

@implementation LMXPCFunction

Expand Down Expand Up @@ -432,6 +433,13 @@ + (void)cmdDispather:(mc_pipe_cmd *)pcmd result:(mc_pipe_result **)ppresult {
*ppresult = [self cmdSimpleReply:fun_ret magic:pcmd->cmd_magic];
break;
}
case MCCMD_FULL_DISK_ACCESS: {
NSLog(@"[info] MCCMD_FULL_DISK_ACCESS cmd");
full_disk_access_param *params = (full_disk_access_param *)(pcmd + 1);
fun_ret = full_disk_access_permission(params->userHomePath, params->userHomePath2);
*ppresult = [self cmdSimpleReply:fun_ret magic:pcmd->cmd_magic];
break;
}
case MCCMD_FIXPLIST:
NSLog(@"[info] MCCMD_FIXPLIST cmd");

Expand Down
14 changes: 14 additions & 0 deletions Tools/LemonDaemon/LemonDaemon/Permission/MCPermissions.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// MCPermissions.h
// LemonDaemon
//
// Copyright © 2024 Tencent. All rights reserved.
//

#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

int full_disk_access_permission(const char *userHomePath, const char *userHomePath2);

NS_ASSUME_NONNULL_END
67 changes: 67 additions & 0 deletions Tools/LemonDaemon/LemonDaemon/Permission/MCPermissions.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
//
// MCPermissions.m
// LemonDaemon
//
// Copyright © 2024 Tencent. All rights reserved.
//

#import "MCPermissions.h"
#import "NSString+Extension.h"

typedef NS_ENUM(NSUInteger, MCFullDiskAuthorationStatus) {
MCFullDiskAuthorationStatusNotDetermined = 0,
MCFullDiskAuthorationStatusDenied = 1,
MCFullDiskAuthorationStatusAuthorized = 2,
};

int full_disk_access_permission(const char *__path__, const char *__path2__) {
if (@available(macOS 10.14, *)) {
//用户目录可能获取不准确,所以通过两种方法获取用户路径并进行验证
NSString *userHomePath = [[NSString alloc] initWithUTF8String:__path__];
NSString *userHomePath2 = [[NSString alloc] initWithUTF8String:__path2__];
NSString *safariHomePath = [userHomePath stringByAppendingPathComponent:@"/Library/Safari"];
NSError *error = nil;
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:safariHomePath error:&error];
if(contents){
NSLog(@"%s, safari contents count : %lu", __FUNCTION__, (unsigned long)contents.count);
return MCFullDiskAuthorationStatusAuthorized;
}else{
NSLog(@"%s, safari contents is null,safariHomePath = %@", __FUNCTION__,safariHomePath);
userHomePath = userHomePath2;
}

safariHomePath = [userHomePath stringByAppendingPathComponent:@"/Library/Safari"];
contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:safariHomePath error:&error];
if(contents){
NSLog(@"%s, safari contents count : %lu", __FUNCTION__, (unsigned long)contents.count);
return MCFullDiskAuthorationStatusAuthorized;
}else{
NSLog(@"%s, safari contents is null,safariHomePath = %@", __FUNCTION__,safariHomePath);
}

NSString *path = [userHomePath stringByAppendingPathComponent:@"/Library/Safari/LastSession.plist"];
NSLog(@"%s,path: %@",__FUNCTION__, path);
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
//发现有用户的系统上没有Bookmarks.plist文件,所以添加对其他文件进行检查
if(!fileExists){
NSLog(@"%s,%@ is not exist", __FUNCTION__, path);
path = [userHomePath stringByAppendingPathComponent:@"Library/Safari/Bookmarks.plist"];
fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
}
NSData *data = [NSData dataWithContentsOfFile:path];
if (data == nil && fileExists)
{
return MCFullDiskAuthorationStatusDenied;
}
else if (fileExists)
{
return MCFullDiskAuthorationStatusAuthorized;
}
else
{
return MCFullDiskAuthorationStatusNotDetermined;
}
}else{
return MCFullDiskAuthorationStatusAuthorized;
}
}
8 changes: 8 additions & 0 deletions Tools/LemonDaemon/LemonDaemon/Pipe/McPipeStruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ typedef struct _client_exit_param
} client_exit_param;


// DAEMON FULL DISK ACCESS
#define MCCMD_FULL_DISK_ACCESS 9304
typedef struct _full_disk_access_param
{
char userHomePath[512];
char userHomePath2[512];
} full_disk_access_param;

#define MCCMD_TASKFORPID 8001

typedef struct _taskforpid_param
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ void init_xpc(void);
int _dm_uninstall_all(void);
void _dm_uninstall_all_async(block_v_i block);

int _full_disk_access(const char *userHomePath, const char *userHomePath2);

// kill process
int _dm_kill_process(pid_t pid);
void _dm_kill_process_async(pid_t pid, block_v_i block);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,38 @@ void _dm_uninstall_all_async(block_v_i block)

}

// mark : full disk access
void full_disk_access_prepare(const char *userHomePath, const char *userHomePath2, mc_pipe_cmd **ppcmd, xpc_operation **ppoperation)
{
full_disk_access_param param;
strncpy(param.userHomePath, userHomePath, sizeof(param.userHomePath) - 1);
strncpy(param.userHomePath2, userHomePath2, sizeof(param.userHomePath2) - 1);

// total size
int cmd_size = sizeof(mc_pipe_cmd) + sizeof(full_disk_access_param);
mc_pipe_cmd *pcmd = (mc_pipe_cmd *)malloc(cmd_size);

// set parameters
pcmd->size = cmd_size;
pcmd->cmd_magic = MCCMD_FULL_DISK_ACCESS;
memcpy(pcmd + 1, &param, sizeof(full_disk_access_param));

*ppcmd = pcmd;

operation_prepare(ppoperation);
}

// 判断守护进程是否有完全磁盘访问权限
int _full_disk_access(const char *userHomePath, const char *userHomePath2) {
mc_pipe_cmd *pcmd = NULL; // malloc
xpc_operation *operation = NULL; // stack var
full_disk_access_prepare(userHomePath, userHomePath2, &pcmd, &operation);
__block mc_pipe_result *presult = NULL;

int return_code = executeXPCCommandQueueSync(pcmd, &presult ,operation);
return pack_normal_return_data(pcmd, presult, operation, return_code);
}


// mark : kill process
void kill_process_prepare(pid_t pid,mc_pipe_cmd **ppcmd, xpc_operation **ppoperation){
Expand Down
Loading

0 comments on commit 7ab09f0

Please sign in to comment.