2 * Win32 miscellaneous functions
4 * Copyright 1995 Thomas Sandford (tdgsandf@prds-grn.demon.co.uk)
7 /* Misc. new functions - they should be moved into appropriate files
17 #include "debugtools.h"
19 DEFAULT_DEBUG_CHANNEL(win32
);
20 DECLARE_DEBUG_CHANNEL(debug
);
23 static BOOL QUERYPERF_Initialized
= 0;
24 #if defined(__i386__) && defined(__GNUC__)
25 static BOOL QUERYPERF_RDTSC_Use
= 0;
26 static LONGLONG QUERYPERF_RDTSC_Frequency
= 0;
29 static void QUERYPERF_Init(void)
31 #if defined(__i386__) && defined(__GNUC__)
32 /* We are running on i386 and compiling on GCC.
33 * Do a runtime check to see if we have the rdtsc instruction available
36 char line
[256], *s
, *value
;
41 if (IsProcessorFeaturePresent( PF_RDTSC_INSTRUCTION_AVAILABLE
))
43 /* rdtsc is available. However, in order to use it
44 * we also need to be able to get the processor's
45 * speed. Currently we do this by reading /proc/cpuinfo
46 * which makes it Linux-specific.
49 TRACE("rdtsc available\n");
51 fp
= fopen( "/proc/cpuinfo", "r" );
54 while(fgets( line
, sizeof(line
), fp
))
56 /* NOTE: the ':' is the only character we can rely on */
57 if (!(value
= strchr( line
, ':' )))
60 /* terminate the valuename */
62 /* skip any leading spaces */
63 while (*value
== ' ') value
++;
64 if ((s
= strchr( value
, '\n' )))
67 if (!strncasecmp( line
, "cpu MHz", strlen( "cpu MHz" ) ))
69 if (sscanf( value
, "%lf", &cpuMHz
) == 1)
71 QUERYPERF_RDTSC_Frequency
= (LONGLONG
)(cpuMHz
* 1000000.0);
72 QUERYPERF_RDTSC_Use
= TRUE
;
73 TRACE("using frequency: %lldHz\n", QUERYPERF_RDTSC_Frequency
);
82 QUERYPERF_Initialized
= TRUE
;
86 /****************************************************************************
87 * QueryPerformanceCounter (KERNEL32.@)
89 BOOL WINAPI
QueryPerformanceCounter(PLARGE_INTEGER counter
)
93 if (!QUERYPERF_Initialized
)
96 #if defined(__i386__) && defined(__GNUC__)
97 if (QUERYPERF_RDTSC_Use
)
99 /* i586 optimized version */
100 __asm__
__volatile__ ( "rdtsc"
101 : "=a" (counter
->s
.LowPart
), "=d" (counter
->s
.HighPart
) );
104 /* fall back to generic routine (ie, for i386, i486) */
107 /* generic routine */
108 gettimeofday( &tv
, NULL
);
109 counter
->QuadPart
= (LONGLONG
)tv
.tv_usec
+ (LONGLONG
)tv
.tv_sec
* 1000000LL;
113 /****************************************************************************
114 * QueryPerformanceFrequency (KERNEL32.@)
116 BOOL WINAPI
QueryPerformanceFrequency(PLARGE_INTEGER frequency
)
118 if (!QUERYPERF_Initialized
)
121 #if defined(__i386__) && defined(__GNUC__)
122 if (QUERYPERF_RDTSC_Use
)
124 frequency
->QuadPart
= QUERYPERF_RDTSC_Frequency
;
129 frequency
->s
.LowPart
= 1000000;
130 frequency
->s
.HighPart
= 0;
134 /****************************************************************************
135 * FlushInstructionCache (KERNEL32.@)
137 BOOL WINAPI
FlushInstructionCache(DWORD x
,DWORD y
,DWORD z
) {
138 FIXME_(debug
)("(0x%08lx,0x%08lx,0x%08lx): stub\n",x
,y
,z
);
142 /***********************************************************************
143 * GetSystemPowerStatus (KERNEL32.@)
145 BOOL WINAPI
GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr
)
147 return FALSE
; /* no power management support */
151 /***********************************************************************
152 * SetSystemPowerState (KERNEL32.@)
154 BOOL WINAPI
SetSystemPowerState(BOOL suspend_or_hibernate
,
157 /* suspend_or_hibernate flag: w95 does not support
158 this feature anyway */
173 /******************************************************************************
174 * CreateMailslotA [KERNEL32.@]
176 HANDLE WINAPI
CreateMailslotA( LPCSTR lpName
, DWORD nMaxMessageSize
,
177 DWORD lReadTimeout
, LPSECURITY_ATTRIBUTES sa
)
179 FIXME("(%s,%ld,%ld,%p): stub\n", debugstr_a(lpName
),
180 nMaxMessageSize
, lReadTimeout
, sa
);
185 /******************************************************************************
186 * CreateMailslotW [KERNEL32.@] Creates a mailslot with specified name
189 * lpName [I] Pointer to string for mailslot name
190 * nMaxMessageSize [I] Maximum message size
191 * lReadTimeout [I] Milliseconds before read time-out
192 * sa [I] Pointer to security structure
195 * Success: Handle to mailslot
196 * Failure: INVALID_HANDLE_VALUE
198 HANDLE WINAPI
CreateMailslotW( LPCWSTR lpName
, DWORD nMaxMessageSize
,
199 DWORD lReadTimeout
, LPSECURITY_ATTRIBUTES sa
)
201 FIXME("(%s,%ld,%ld,%p): stub\n", debugstr_w(lpName
),
202 nMaxMessageSize
, lReadTimeout
, sa
);
207 /******************************************************************************
208 * GetMailslotInfo [KERNEL32.@] Retrieves info about specified mailslot
211 * hMailslot [I] Mailslot handle
212 * lpMaxMessageSize [O] Address of maximum message size
213 * lpNextSize [O] Address of size of next message
214 * lpMessageCount [O] Address of number of messages
215 * lpReadTimeout [O] Address of read time-out
221 BOOL WINAPI
GetMailslotInfo( HANDLE hMailslot
, LPDWORD lpMaxMessageSize
,
222 LPDWORD lpNextSize
, LPDWORD lpMessageCount
,
223 LPDWORD lpReadTimeout
)
225 FIXME("(%04x): stub\n",hMailslot
);
226 if (lpMaxMessageSize
) *lpMaxMessageSize
= (DWORD
)NULL
;
227 if (lpNextSize
) *lpNextSize
= (DWORD
)NULL
;
228 if (lpMessageCount
) *lpMessageCount
= (DWORD
)NULL
;
229 if (lpReadTimeout
) *lpReadTimeout
= (DWORD
)NULL
;
234 /******************************************************************************
235 * GetCompressedFileSizeA [KERNEL32.@]
238 * This should call the W function below
240 DWORD WINAPI
GetCompressedFileSizeA(
242 LPDWORD lpFileSizeHigh
)
244 FIXME("(...): stub\n");
249 /******************************************************************************
250 * GetCompressedFileSizeW [KERNEL32.@]
253 * Success: Low-order doubleword of number of bytes
254 * Failure: 0xffffffff
256 DWORD WINAPI
GetCompressedFileSizeW(
257 LPCWSTR lpFileName
, /* [in] Pointer to name of file */
258 LPDWORD lpFileSizeHigh
) /* [out] Receives high-order doubleword of size */
260 FIXME("(%s,%p): stub\n",debugstr_w(lpFileName
),lpFileSizeHigh
);
265 /******************************************************************************
266 * SetComputerNameA [KERNEL32.@]
268 BOOL WINAPI
SetComputerNameA( LPCSTR lpComputerName
)
270 LPWSTR lpComputerNameW
= HEAP_strdupAtoW(GetProcessHeap(),0,lpComputerName
);
271 BOOL ret
= SetComputerNameW(lpComputerNameW
);
272 HeapFree(GetProcessHeap(),0,lpComputerNameW
);
277 /******************************************************************************
278 * SetComputerNameW [KERNEL32.@]
281 * lpComputerName [I] Address of new computer name
285 BOOL WINAPI
SetComputerNameW( LPCWSTR lpComputerName
)
287 FIXME("(%s): stub\n", debugstr_w(lpComputerName
));
291 /******************************************************************************
292 * CreateIoCompletionPort (KERNEL32.@)
294 HANDLE WINAPI
CreateIoCompletionPort(HANDLE hFileHandle
,
295 HANDLE hExistingCompletionPort
, DWORD dwCompletionKey
,
296 DWORD dwNumberOfConcurrentThreads
)
298 FIXME("(%04x, %04x, %08lx, %08lx): stub.\n", hFileHandle
, hExistingCompletionPort
, dwCompletionKey
, dwNumberOfConcurrentThreads
);
302 /******************************************************************************
303 * GetQueuedCompletionStatus (KERNEL32.@)
305 BOOL WINAPI
GetQueuedCompletionStatus(
306 HANDLE CompletionPort
, LPDWORD lpNumberOfBytesTransferred
,
307 LPDWORD lpCompletionKey
, LPOVERLAPPED
*lpOverlapped
, DWORD dwMilliseconds
309 FIXME("(%x,%p,%p,%p,%ld), stub!\n",CompletionPort
,lpNumberOfBytesTransferred
,lpCompletionKey
,lpOverlapped
,dwMilliseconds
);
310 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);