00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "csrdll.h"
00023
00024
NTSTATUS
00025 CsrClientCallServer(
00026 IN OUT PCSR_API_MSG m,
00027 IN OUT PCSR_CAPTURE_HEADER CaptureBuffer OPTIONAL,
00028 IN CSR_API_NUMBER ApiNumber,
00029 IN ULONG ArgLength
00030 )
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 {
00064
NTSTATUS Status;
00065 PULONG_PTR PointerOffsets;
00066 ULONG CountPointers;
00067 ULONG_PTR Pointer;
00068
00069
00070
00071
00072
00073
if ((LONG)ArgLength < 0) {
00074 ArgLength = (ULONG)(-(LONG)ArgLength);
00075 m->h.u2.s2.Type = 0;
00076 }
00077
else {
00078 m->h.u2.ZeroInit = 0;
00079 }
00080
00081 ArgLength |= (ArgLength << 16);
00082 ArgLength += ((
sizeof( CSR_API_MSG ) -
sizeof( m->u )) << 16) |
00083 (FIELD_OFFSET( CSR_API_MSG, u ) -
sizeof( m->h ));
00084 m->h.u1.Length = ArgLength;
00085 m->CaptureBuffer =
NULL;
00086 m->ApiNumber = ApiNumber;
00087
00088
00089
00090
00091
00092
00093
if (
CsrServerProcess ==
FALSE) {
00094
00095
00096
00097
00098
00099
00100
00101
00102
if (ARGUMENT_PRESENT( CaptureBuffer )) {
00103
00104
00105
00106
00107
00108 m->CaptureBuffer = (PCSR_CAPTURE_HEADER)
00109 ((PCHAR)CaptureBuffer +
CsrPortMemoryRemoteDelta);
00110
00111
00112
00113
00114
00115
00116 CaptureBuffer->FreeSpace =
NULL;
00117
00118
00119
00120
00121
00122
00123
00124 PointerOffsets = CaptureBuffer->MessagePointerOffsets;
00125 CountPointers = CaptureBuffer->CountMessagePointers;
00126
while (CountPointers--) {
00127 Pointer = *PointerOffsets++;
00128
if (Pointer != 0) {
00129 *(PULONG_PTR)Pointer +=
CsrPortMemoryRemoteDelta;
00130 PointerOffsets[ -1 ] = Pointer - (ULONG_PTR)m;
00131 }
00132 }
00133 }
00134
00135
00136
00137
00138
00139
00140
Status =
NtRequestWaitReplyPort(
CsrPortHandle,
00141 (PPORT_MESSAGE)m,
00142 (PPORT_MESSAGE)m
00143 );
00144
00145
00146
00147
00148
00149
00150
if (ARGUMENT_PRESENT( CaptureBuffer )) {
00151
00152
00153
00154
00155 m->CaptureBuffer = (PCSR_CAPTURE_HEADER)
00156 ((PCHAR)m->CaptureBuffer -
CsrPortMemoryRemoteDelta);
00157
00158
00159
00160
00161
00162
00163
00164 PointerOffsets = CaptureBuffer->MessagePointerOffsets;
00165 CountPointers = CaptureBuffer->CountMessagePointers;
00166
while (CountPointers--) {
00167 Pointer = *PointerOffsets++;
00168
if (Pointer != 0) {
00169 Pointer += (ULONG_PTR)m;
00170 PointerOffsets[ -1 ] = Pointer;
00171 *(PULONG_PTR)Pointer -=
CsrPortMemoryRemoteDelta;
00172 }
00173 }
00174 }
00175
00176
00177
00178
00179
if (!
NT_SUCCESS(
Status )) {
00180
IF_DEBUG {
00181
if (
Status != STATUS_PORT_DISCONNECTED &&
00182
Status != STATUS_INVALID_HANDLE
00183 ) {
00184
DbgPrint(
"CSRDLL: NtRequestWaitReplyPort failed - Status == %X\n",
00185
Status
00186 );
00187 }
00188 }
00189
00190 m->ReturnValue =
Status;
00191 }
00192 }
00193
else {
00194 m->h.ClientId = NtCurrentTeb()->ClientId;
00195
Status = (
CsrServerApiRoutine)((PCSR_API_MSG)m,
00196 (PCSR_API_MSG)m
00197 );
00198
00199
00200
00201
00202
00203
if (!
NT_SUCCESS(
Status )) {
00204
IF_DEBUG {
00205
DbgPrint(
"CSRDLL: Server side client call failed - Status == %X\n",
00206
Status
00207 );
00208 }
00209
00210 m->ReturnValue =
Status;
00211 }
00212 }
00213
00214
00215
00216
00217
00218
return( m->ReturnValue );
00219 }
00220
00221
00222 PCSR_CAPTURE_HEADER
00223 CsrAllocateCaptureBuffer(
00224 IN ULONG CountMessagePointers,
00225 IN ULONG Size
00226 )
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 {
00254 PCSR_CAPTURE_HEADER CaptureBuffer;
00255 ULONG CountPointers;
00256
00257
00258
00259
00260
00261 CountPointers = CountMessagePointers;
00262
00263
00264
00265
00266
00267
00268
00269
00270
if (
Size >= MAXLONG) {
00271
00272
00273
00274
return NULL;
00275 }
00276
Size += FIELD_OFFSET(CSR_CAPTURE_HEADER, MessagePointerOffsets) + (CountPointers *
sizeof( PVOID ));
00277
Size = (
Size + (3 * (CountPointers+1))) & ~3;
00278
00279
00280
00281
00282
00283 CaptureBuffer =
RtlAllocateHeap(
CsrPortHeap,
MAKE_CSRPORT_TAG(
CAPTURE_TAG ),
Size );
00284
if (CaptureBuffer ==
NULL) {
00285
00286
00287
00288
00289
00290
00291
return(
NULL );
00292 }
00293
00294
00295
00296
00297
00298 CaptureBuffer->Length =
Size;
00299 CaptureBuffer->CountMessagePointers = 0;
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 RtlZeroMemory( CaptureBuffer->MessagePointerOffsets,
00310 CountPointers *
sizeof( ULONG_PTR )
00311 );
00312
00313 CaptureBuffer->FreeSpace = (PCHAR)
00314 (CaptureBuffer->MessagePointerOffsets + CountPointers);
00315
00316
00317
00318
00319
00320
return( CaptureBuffer );
00321 }
00322
00323
00324
VOID
00325 CsrFreeCaptureBuffer(
00326 IN PCSR_CAPTURE_HEADER CaptureBuffer
00327 )
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 {
00347
00348
00349
00350
00351
RtlFreeHeap(
CsrPortHeap, 0, CaptureBuffer );
00352 }
00353
00354
00355 ULONG
00356 CsrAllocateMessagePointer(
00357 IN OUT PCSR_CAPTURE_HEADER CaptureBuffer,
00358 IN ULONG Length,
00359 OUT PVOID *Pointer
00360 )
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 {
00388
if (Length == 0) {
00389 *Pointer =
NULL;
00390 Pointer =
NULL;
00391 }
00392
00393
else {
00394
00395
00396
00397
00398
00399
00400 *Pointer = CaptureBuffer->FreeSpace;
00401
00402
00403
00404
00405
00406
if (Length >= MAXLONG) {
00407
00408
00409
00410
return 0;
00411 }
00412
00413 Length = (Length + 3) & ~3;
00414
00415
00416
00417
00418
00419
00420 CaptureBuffer->FreeSpace += Length;
00421 }
00422
00423
00424
00425
00426
00427
00428
00429
00430 CaptureBuffer->MessagePointerOffsets[ CaptureBuffer->CountMessagePointers++ ] =
00431 (ULONG_PTR)Pointer;
00432
00433
00434
00435
00436
00437
return( Length );
00438 }
00439
00440
00441
VOID
00442 CsrCaptureMessageBuffer(
00443 IN OUT PCSR_CAPTURE_HEADER CaptureBuffer,
00444 IN PVOID Buffer OPTIONAL,
00445 IN ULONG Length,
00446 OUT PVOID *CapturedBuffer
00447 )
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477 {
00478
00479
00480
00481
00482
00483
CsrAllocateMessagePointer( CaptureBuffer,
00484 Length,
00485 CapturedBuffer
00486 );
00487
00488
00489
00490
00491
00492
00493
if (!ARGUMENT_PRESENT(
Buffer ) || (Length == 0)) {
00494
return;
00495 }
00496
00497
00498
00499
00500
00501 RtlMoveMemory( *CapturedBuffer,
Buffer, Length );
00502
00503
return;
00504 }
00505
00506
VOID
00507 CsrCaptureMessageString(
00508 IN OUT PCSR_CAPTURE_HEADER CaptureBuffer,
00509 IN PCSTR String OPTIONAL,
00510 IN ULONG Length,
00511 IN ULONG MaximumLength,
00512 OUT PSTRING CapturedString
00513 )
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547 {
00548
00549
00550
00551
00552
00553
if (!ARGUMENT_PRESENT(
String )) {
00554 CapturedString->Length = 0;
00555 CapturedString->MaximumLength = (
USHORT)MaximumLength;
00556
CsrAllocateMessagePointer( CaptureBuffer,
00557 MaximumLength,
00558 (PVOID *)&CapturedString->Buffer
00559 );
00560
return;
00561 }
00562
00563
00564
00565
00566
00567
00568 CapturedString->Length = (
USHORT)Length;
00569 CapturedString->MaximumLength = (
USHORT)
00570
CsrAllocateMessagePointer( CaptureBuffer,
00571 MaximumLength,
00572 (PVOID *)&CapturedString->Buffer
00573 );
00574
00575
00576
00577
00578
00579
if (Length != 0) {
00580 RtlMoveMemory( CapturedString->Buffer,
String, MaximumLength );
00581
if (CapturedString->Length < CapturedString->MaximumLength) {
00582 CapturedString->Buffer[ CapturedString->Length ] =
'\0';
00583 }
00584 }
00585
00586
return;
00587 }
00588
00589
00590
00591 PLARGE_INTEGER
00592 CsrCaptureTimeout(
00593 IN ULONG MilliSeconds,
00594 OUT PLARGE_INTEGER Timeout
00595 )
00596 {
00597
if (MilliSeconds == -1) {
00598
return(
NULL );
00599 }
00600
else {
00601 Timeout->QuadPart = Int32x32To64( MilliSeconds, -10000 );
00602
return( (PLARGE_INTEGER)Timeout );
00603 }
00604 }
00605
00606
VOID
00607 CsrProbeForWrite(
00608 IN PVOID Address,
00609 IN ULONG Length,
00610 IN ULONG Alignment
00611 )
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636 {
00637
volatile CHAR *StartAddress;
00638
volatile CHAR *EndAddress;
00639
CHAR Temp;
00640
00641
00642
00643
00644
00645
00646
if (Length != 0) {
00647
00648
00649
00650
00651
00652
00653
ASSERT((Alignment == 1) || (Alignment == 2) ||
00654 (Alignment == 4) || (Alignment == 8));
00655 StartAddress = (
volatile CHAR *)Address;
00656
00657
if (((ULONG_PTR)StartAddress & (Alignment - 1)) != 0) {
00658
RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
00659 }
else {
00660
00661
00662
00663
00664
if ((ULONG_PTR)StartAddress >
CsrNtSysInfo.MaximumUserModeAddress) {
00665
RtlRaiseStatus(STATUS_ACCESS_VIOLATION);
00666 }
00667
00668 Temp = *StartAddress;
00669 *StartAddress = Temp;
00670 EndAddress = StartAddress + Length - 1;
00671 Temp = *EndAddress;
00672 *EndAddress = Temp;
00673 }
00674 }
00675 }
00676
00677
VOID
00678 CsrProbeForRead(
00679 IN PVOID Address,
00680 IN ULONG Length,
00681 IN ULONG Alignment
00682 )
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707 {
00708
volatile CHAR *StartAddress;
00709
volatile CHAR *EndAddress;
00710
CHAR Temp;
00711
00712
00713
00714
00715
00716
00717
if (Length != 0) {
00718
00719
00720
00721
00722
00723
00724
ASSERT((Alignment == 1) || (Alignment == 2) ||
00725 (Alignment == 4) || (Alignment == 8));
00726 StartAddress = (
volatile CHAR *)Address;
00727
00728
if (((ULONG_PTR)StartAddress & (Alignment - 1)) != 0) {
00729
RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
00730 }
else {
00731 Temp = *StartAddress;
00732 EndAddress = StartAddress + Length - 1;
00733 Temp = *EndAddress;
00734 }
00735 }
00736 }