[PATCH 4/4] kernel32: Forward power request functions to ntdll.
Chip Davis
cdavis at codeweavers.com
Wed Jul 31 17:24:58 CDT 2019
Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
dlls/kernel32/powermgnt.c | 53 +++++++++++++++++++++++++++++++--------
include/winnt.h | 5 ++++
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/dlls/kernel32/powermgnt.c b/dlls/kernel32/powermgnt.c
index 056dd9df692..190dc016c31 100644
--- a/dlls/kernel32/powermgnt.c
+++ b/dlls/kernel32/powermgnt.c
@@ -19,10 +19,15 @@
#include <stdarg.h>
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winternl.h"
#include "wine/debug.h"
+#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL(powermgnt);
@@ -113,10 +118,36 @@ EXECUTION_STATE WINAPI SetThreadExecutionState(EXECUTION_STATE flags)
*/
HANDLE WINAPI PowerCreateRequest(REASON_CONTEXT *context)
{
- FIXME("(%p): stub\n", context);
+ COUNTED_REASON_CONTEXT nt_context;
+ HANDLE handle;
+ NTSTATUS status;
+ WCHAR module_name[MAX_PATH];
+
+ TRACE( "(%p)\n", context );
+
+ nt_context.Version = context->Version;
+ nt_context.Flags = context->Flags;
+ if (context->Flags & POWER_REQUEST_CONTEXT_SIMPLE_STRING)
+ RtlInitUnicodeString( &nt_context.u.SimpleString, context->Reason.SimpleReasonString );
+ else if (context->Flags & POWER_REQUEST_CONTEXT_DETAILED_STRING)
+ {
+ int i;
+
+ GetModuleFileNameW( context->Reason.Detailed.LocalizedReasonModule, module_name, ARRAY_SIZE(module_name) );
+ RtlInitUnicodeString( &nt_context.u.s.ResourceFileName, module_name );
+ nt_context.u.s.ResourceReasonId = context->Reason.Detailed.LocalizedReasonId;
+ nt_context.u.s.StringCount = context->Reason.Detailed.ReasonStringCount;
+ nt_context.u.s.ReasonStrings = heap_alloc( nt_context.u.s.StringCount * sizeof(UNICODE_STRING) );
+ for (i = 0; i < nt_context.u.s.StringCount; i++)
+ RtlInitUnicodeString( &nt_context.u.s.ReasonStrings[i], context->Reason.Detailed.ReasonStrings[i] );
+ }
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return INVALID_HANDLE_VALUE;
+ status = NtCreatePowerRequest( &handle, &nt_context );
+ if (nt_context.Flags & POWER_REQUEST_CONTEXT_DETAILED_STRING)
+ heap_free( nt_context.u.s.ReasonStrings );
+ if (status)
+ SetLastError( RtlNtStatusToDosError(status) );
+ return status == STATUS_SUCCESS ? handle : INVALID_HANDLE_VALUE;
}
/***********************************************************************
@@ -124,10 +155,10 @@ HANDLE WINAPI PowerCreateRequest(REASON_CONTEXT *context)
*/
BOOL WINAPI PowerSetRequest(HANDLE request, POWER_REQUEST_TYPE type)
{
- FIXME("(%p, %u): stub\n", request, type);
-
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ NTSTATUS status = NtSetPowerRequest( request, type );
+ if (status)
+ SetLastError( RtlNtStatusToDosError(status) );
+ return status == STATUS_SUCCESS;
}
/***********************************************************************
@@ -135,8 +166,8 @@ BOOL WINAPI PowerSetRequest(HANDLE request, POWER_REQUEST_TYPE type)
*/
BOOL WINAPI PowerClearRequest(HANDLE request, POWER_REQUEST_TYPE type)
{
- FIXME("(%p, %u): stub\n", request, type);
-
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ NTSTATUS status = NtClearPowerRequest( request, type );
+ if (status)
+ SetLastError( RtlNtStatusToDosError(status) );
+ return status == STATUS_SUCCESS;
}
diff --git a/include/winnt.h b/include/winnt.h
index 40d883e3a92..e73821112d3 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -5582,6 +5582,11 @@ typedef struct _SYSTEM_POWER_POLICY {
} SYSTEM_POWER_POLICY,
*PSYSTEM_POWER_POLICY;
+#define POWER_REQUEST_CONTEXT_VERSION 0
+
+#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
+#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
+
typedef union _FILE_SEGMENT_ELEMENT {
PVOID64 Buffer;
ULONGLONG Alignment;
--
2.21.0
More information about the wine-devel
mailing list