886 |
|
|
887 |
} |
} |
888 |
|
|
889 |
|
/* Process a disconnect PDU */ |
890 |
|
void |
891 |
|
process_disconnect_pdu(STREAM s, uint32 * ext_disc_reason) |
892 |
|
{ |
893 |
|
in_uint32_le(s, *ext_disc_reason); |
894 |
|
|
895 |
|
DEBUG(("Received disconnect PDU\n")); |
896 |
|
} |
897 |
|
|
898 |
/* Process data PDU */ |
/* Process data PDU */ |
899 |
static void |
static BOOL |
900 |
process_data_pdu(STREAM s) |
process_data_pdu(STREAM s, uint32 * ext_disc_reason) |
901 |
{ |
{ |
902 |
uint8 data_pdu_type; |
uint8 data_pdu_type; |
903 |
uint8 ctype; |
uint8 ctype; |
948 |
process_update_pdu(s); |
process_update_pdu(s); |
949 |
break; |
break; |
950 |
|
|
951 |
|
case RDP_DATA_PDU_CONTROL: |
952 |
|
DEBUG(("Received Control PDU\n")); |
953 |
|
break; |
954 |
|
|
955 |
|
case RDP_DATA_PDU_SYNCHRONISE: |
956 |
|
DEBUG(("Received Sync PDU\n")); |
957 |
|
break; |
958 |
|
|
959 |
case RDP_DATA_PDU_POINTER: |
case RDP_DATA_PDU_POINTER: |
960 |
process_pointer_pdu(s); |
process_pointer_pdu(s); |
961 |
break; |
break; |
970 |
break; |
break; |
971 |
|
|
972 |
case RDP_DATA_PDU_DISCONNECT: |
case RDP_DATA_PDU_DISCONNECT: |
973 |
/* Normally received when user logs out or disconnects from a |
process_disconnect_pdu(s, ext_disc_reason); |
974 |
console session on Windows XP and 2003 Server */ |
return True; |
|
DEBUG(("Received disconnect PDU\n")); |
|
|
break; |
|
975 |
|
|
976 |
default: |
default: |
977 |
unimpl("data PDU %d\n", data_pdu_type); |
unimpl("data PDU %d\n", data_pdu_type); |
978 |
} |
} |
979 |
|
return False; |
980 |
} |
} |
981 |
|
|
982 |
/* Process incoming packets */ |
/* Process incoming packets */ |
983 |
BOOL |
void |
984 |
rdp_main_loop(void) |
rdp_main_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
985 |
{ |
{ |
986 |
uint8 type; |
uint8 type; |
987 |
|
BOOL disc = False; /* True when a disconnect PDU was received */ |
988 |
STREAM s; |
STREAM s; |
989 |
|
|
990 |
while ((s = rdp_recv(&type)) != NULL) |
while ((s = rdp_recv(&type)) != NULL) |
993 |
{ |
{ |
994 |
case RDP_PDU_DEMAND_ACTIVE: |
case RDP_PDU_DEMAND_ACTIVE: |
995 |
process_demand_active(s); |
process_demand_active(s); |
996 |
|
*deactivated = False; |
997 |
break; |
break; |
998 |
|
|
999 |
case RDP_PDU_DEACTIVATE: |
case RDP_PDU_DEACTIVATE: |
1000 |
DEBUG(("RDP_PDU_DEACTIVATE\n")); |
*deactivated = True; |
|
/* We thought we could detect a clean |
|
|
shutdown of the session by this |
|
|
packet, but it seems Windows 2003 |
|
|
is sending us one of these when we |
|
|
reconnect to a disconnected session |
|
|
return True; */ |
|
1001 |
break; |
break; |
1002 |
|
|
1003 |
case RDP_PDU_DATA: |
case RDP_PDU_DATA: |
1004 |
process_data_pdu(s); |
disc = process_data_pdu(s, ext_disc_reason); |
1005 |
break; |
break; |
1006 |
|
|
1007 |
case 0: |
case 0: |
1010 |
default: |
default: |
1011 |
unimpl("PDU %d\n", type); |
unimpl("PDU %d\n", type); |
1012 |
} |
} |
1013 |
|
|
1014 |
|
if (disc) |
1015 |
|
{ |
1016 |
|
return; |
1017 |
|
} |
1018 |
} |
} |
1019 |
return True; |
return; |
|
/* We want to detect if we got a clean shutdown, but we |
|
|
can't. Se above. |
|
|
return False; */ |
|
1020 |
} |
} |
1021 |
|
|
1022 |
/* Establish a connection up to the RDP layer */ |
/* Establish a connection up to the RDP layer */ |