mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 03:28:38 -05:00 
			
		
		
		
	launcher, launchctl: refactoring
This commit is contained in:
		| @@ -61,7 +61,7 @@ static void usage(void) | ||||
|         PROGNAME); | ||||
| } | ||||
|  | ||||
| static int callpipe_and_report(PWSTR PipeBuf, ULONG SendSize, ULONG RecvSize) | ||||
| static int call_pipe_and_report(PWSTR PipeBuf, ULONG SendSize, ULONG RecvSize) | ||||
| { | ||||
|     DWORD LastError, BytesTransferred; | ||||
|  | ||||
| @@ -131,7 +131,7 @@ int start(PWSTR PipeBuf, ULONG PipeBufSize, | ||||
|         memcpy(P, Argv[Argi], ArgvSize * sizeof(WCHAR)); P += ArgvSize; | ||||
|     } | ||||
|  | ||||
|     return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
|     return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
| } | ||||
|  | ||||
| int stop(PWSTR PipeBuf, ULONG PipeBufSize, | ||||
| @@ -151,20 +151,7 @@ int stop(PWSTR PipeBuf, ULONG PipeBufSize, | ||||
|     memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize; | ||||
|     memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize; | ||||
|  | ||||
|     return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
| } | ||||
|  | ||||
| int list(PWSTR PipeBuf, ULONG PipeBufSize) | ||||
| { | ||||
|     PWSTR P; | ||||
|  | ||||
|     if (PipeBufSize < 1 * sizeof(WCHAR)) | ||||
|         return ERROR_INVALID_PARAMETER; | ||||
|  | ||||
|     P = PipeBuf; | ||||
|     *P++ = LauncherSvcInstanceList; | ||||
|  | ||||
|     return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
|     return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
| } | ||||
|  | ||||
| int getinfo(PWSTR PipeBuf, ULONG PipeBufSize, | ||||
| @@ -184,7 +171,20 @@ int getinfo(PWSTR PipeBuf, ULONG PipeBufSize, | ||||
|     memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize; | ||||
|     memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize; | ||||
|  | ||||
|     return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
|     return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
| } | ||||
|  | ||||
| int list(PWSTR PipeBuf, ULONG PipeBufSize) | ||||
| { | ||||
|     PWSTR P; | ||||
|  | ||||
|     if (PipeBufSize < 1 * sizeof(WCHAR)) | ||||
|         return ERROR_INVALID_PARAMETER; | ||||
|  | ||||
|     P = PipeBuf; | ||||
|     *P++ = LauncherSvcInstanceList; | ||||
|  | ||||
|     return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); | ||||
| } | ||||
|  | ||||
| int wmain(int argc, wchar_t **argv) | ||||
| @@ -218,14 +218,6 @@ int wmain(int argc, wchar_t **argv) | ||||
|         return stop(PipeBuf, PIPE_BUFFER_SIZE, argv[1], argv[2]); | ||||
|     } | ||||
|     else | ||||
|     if (0 == lstrcmpW(L"list", argv[0])) | ||||
|     { | ||||
|         if (1 != argc) | ||||
|             usage(); | ||||
|  | ||||
|         return list(PipeBuf, PIPE_BUFFER_SIZE); | ||||
|     } | ||||
|     else | ||||
|     if (0 == lstrcmpW(L"info", argv[0])) | ||||
|     { | ||||
|         if (3 != argc) | ||||
| @@ -233,6 +225,14 @@ int wmain(int argc, wchar_t **argv) | ||||
|  | ||||
|         return getinfo(PipeBuf, PIPE_BUFFER_SIZE, argv[1], argv[2]); | ||||
|     } | ||||
|     else | ||||
|     if (0 == lstrcmpW(L"list", argv[0])) | ||||
|     { | ||||
|         if (1 != argc) | ||||
|             usage(); | ||||
|  | ||||
|         return list(PipeBuf, PIPE_BUFFER_SIZE); | ||||
|     } | ||||
|     else | ||||
|         usage(); | ||||
|  | ||||
|   | ||||
| @@ -374,40 +374,6 @@ exit: | ||||
|     return Result; | ||||
| } | ||||
|  | ||||
| NTSTATUS SvcInstanceGetNameList(HANDLE ClientToken, | ||||
|     PWSTR Buffer, PULONG PSize) | ||||
| { | ||||
|     SVC_INSTANCE *SvcInstance; | ||||
|     PLIST_ENTRY ListEntry; | ||||
|     PWSTR P = Buffer, BufferEnd = P + *PSize / sizeof(WCHAR); | ||||
|     ULONG ClassNameSize, InstanceNameSize; | ||||
|  | ||||
|     EnterCriticalSection(&SvcInstanceLock); | ||||
|  | ||||
|     for (ListEntry = SvcInstanceList.Flink; | ||||
|         &SvcInstanceList != ListEntry; | ||||
|         ListEntry = ListEntry->Flink) | ||||
|     { | ||||
|         SvcInstance = CONTAINING_RECORD(ListEntry, SVC_INSTANCE, ListEntry); | ||||
|  | ||||
|         ClassNameSize = lstrlenW(SvcInstance->ClassName) + 1; | ||||
|         InstanceNameSize = lstrlenW(SvcInstance->InstanceName) + 1; | ||||
|  | ||||
|         if (BufferEnd < P + ClassNameSize + InstanceNameSize) | ||||
|             break; | ||||
|  | ||||
|         memcpy(P, SvcInstance->ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize; | ||||
|         *Buffer++ = L' '; | ||||
|         memcpy(P, SvcInstance->InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize; | ||||
|     } | ||||
|  | ||||
|     LeaveCriticalSection(&SvcInstanceLock); | ||||
|  | ||||
|     *PSize = (ULONG)(P - Buffer); | ||||
|  | ||||
|     return STATUS_SUCCESS; | ||||
| } | ||||
|  | ||||
| NTSTATUS SvcInstanceGetInfo(HANDLE ClientToken, | ||||
|     PWSTR ClassName, PWSTR InstanceName, PWSTR Buffer, PULONG PSize) | ||||
| { | ||||
| @@ -453,6 +419,40 @@ exit: | ||||
|     return Result; | ||||
| } | ||||
|  | ||||
| NTSTATUS SvcInstanceGetNameList(HANDLE ClientToken, | ||||
|     PWSTR Buffer, PULONG PSize) | ||||
| { | ||||
|     SVC_INSTANCE *SvcInstance; | ||||
|     PLIST_ENTRY ListEntry; | ||||
|     PWSTR P = Buffer, BufferEnd = P + *PSize / sizeof(WCHAR); | ||||
|     ULONG ClassNameSize, InstanceNameSize; | ||||
|  | ||||
|     EnterCriticalSection(&SvcInstanceLock); | ||||
|  | ||||
|     for (ListEntry = SvcInstanceList.Flink; | ||||
|         &SvcInstanceList != ListEntry; | ||||
|         ListEntry = ListEntry->Flink) | ||||
|     { | ||||
|         SvcInstance = CONTAINING_RECORD(ListEntry, SVC_INSTANCE, ListEntry); | ||||
|  | ||||
|         ClassNameSize = lstrlenW(SvcInstance->ClassName) + 1; | ||||
|         InstanceNameSize = lstrlenW(SvcInstance->InstanceName) + 1; | ||||
|  | ||||
|         if (BufferEnd < P + ClassNameSize + InstanceNameSize) | ||||
|             break; | ||||
|  | ||||
|         memcpy(P, SvcInstance->ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize; | ||||
|         *Buffer++ = L' '; | ||||
|         memcpy(P, SvcInstance->InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize; | ||||
|     } | ||||
|  | ||||
|     LeaveCriticalSection(&SvcInstanceLock); | ||||
|  | ||||
|     *PSize = (ULONG)(P - Buffer); | ||||
|  | ||||
|     return STATUS_SUCCESS; | ||||
| } | ||||
|  | ||||
| static HANDLE SvcThread, SvcEvent; | ||||
| static HANDLE SvcPipe = INVALID_HANDLE_VALUE; | ||||
| static OVERLAPPED SvcOverlapped; | ||||
| @@ -735,13 +735,6 @@ static VOID SvcPipeTransact(HANDLE ClientToken, PWSTR PipeBuf, PULONG PSize) | ||||
|         SvcPipeTransactResult(Result, PipeBuf, PSize); | ||||
|         break; | ||||
|  | ||||
|     case LauncherSvcInstanceList: | ||||
|         *PSize = PIPE_BUFFER_SIZE - 1; | ||||
|         Result = SvcInstanceGetNameList(ClientToken, PipeBuf + 1, PSize); | ||||
|  | ||||
|         SvcPipeTransactResult(Result, PipeBuf, PSize); | ||||
|         break; | ||||
|  | ||||
|     case LauncherSvcInstanceInfo: | ||||
|         ClassName = SvcPipeTransactGetPart(&P, PipeBufEnd); | ||||
|         InstanceName = SvcPipeTransactGetPart(&P, PipeBufEnd); | ||||
| @@ -756,6 +749,13 @@ static VOID SvcPipeTransact(HANDLE ClientToken, PWSTR PipeBuf, PULONG PSize) | ||||
|         SvcPipeTransactResult(Result, PipeBuf, PSize); | ||||
|         break; | ||||
|  | ||||
|     case LauncherSvcInstanceList: | ||||
|         *PSize = PIPE_BUFFER_SIZE - 1; | ||||
|         Result = SvcInstanceGetNameList(ClientToken, PipeBuf + 1, PSize); | ||||
|  | ||||
|         SvcPipeTransactResult(Result, PipeBuf, PSize); | ||||
|         break; | ||||
|  | ||||
|     default: | ||||
|         SvcPipeTransactResult(STATUS_INVALID_PARAMETER, PipeBuf, PSize); | ||||
|         break; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user